假设我有以下np.uint8
数组:
In [9]: a = np.array([0x34, 0xF3, 0x87, 0x42]).astype(np.uint8)
In [10]: a
Out[10]: array([0x34, 0xf3, 0x87, 0x42], dtype=uint8)
现在当我转换为np.uint16
时,我得到以下内容:
In [11]: b = a.astype(np.uint16)
In [12]: b
Out[12]: array([0x34, 0xf3, 0x87, 0x42], dtype=uint16)
这是预期会发生的事情,但我想要别的东西。
例如,在C中,如果您具有类型为uint8
(unsigned char
)的相同数组,并且您想要访问它,就像它是包含uint16
的数组一样({{1} })元素:
unsigned short
这将给我,正如预期的C:
unsigned char a[] = {0x34, 0xF3, 0x87, 0x42};
unsigned short* b = (unsigned short*)a;
现在我的问题是,如何在Python中执行此类操作? (甚至可以在不创建新数组的情况下从一种类型转换为另一种类型吗?)
我可以通过位移创建一个新数组,并像这样添加两个字节:
0x34 0xF3 0x87 0x42 // for a
0xF334 0x4287 // for b, little or big endian, for me doesn't matter
我需要这个非常大的数组(或多或少),所以我想问这是否有可能在Python中更有效率。
答案 0 :(得分:3)
videoHolderView.addSubview(customObject.videoPlayerView)
这是一种危险且容易出错的操作。请记住在C ++中应该记住的所有相同注意事项,例如字节顺序。您还需要担心其他警告,例如非连续数组内存布局。至少严格的别名是别人的问题;实现可能违反C严格别名规则,但希望他们设置编译器标志或某些东西来获得定义的行为。 (b = a.view(np.uint16)
为uint8
,因此严格的别名不适用,但unsigned char
也允许ndarray.view
- > uint64
重新解释等内容。)
答案 1 :(得分:2)
我实际上并不建议(@user2357112
already explained why),但您也可以手动更改(设置)dtype
属性:
>>> import numpy as np
>>> a = np.array([0x34, 0xF3, 0x87, 0x42]).astype(np.uint8)
>>> a.dtype = np.uint16
>>> a
array([62260, 17031], dtype=uint16)