如何在Python中执行C-Style Typecasting?

时间:2017-02-02 00:55:12

标签: python python-3.x numpy type-conversion

假设我有以下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中,如果您具有类型为uint8unsigned 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中更有效率。

2 个答案:

答案 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)