繁体   English   中英

如何在Python中执行C样式类型转换?

[英]How can I perform C-Style Typecasting in Python?

可以说我有以下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 )的相同数组,并且希望像访问包含uint16unsigned short )元素的数组一样对其进行访问时:

unsigned char a[] = {0x34, 0xF3, 0x87, 0x42};
unsigned short* b = (unsigned short*)a;

如我对C的预期,这将给我:

0x34 0xF3 0x87 0x42  // for a
0xF334    0x4287     // for b, little or big endian, for me doesn't matter

现在我的问题是,如何在Python中执行此类操作? (是否有可能在不创建新数组的情况下从一种类型转换为另一种类型?)

我可以通过移位并将两个字节加在一起来创建一个新数组,如下所示:

#! /usr/bin/python3

import numpy as np

np.set_printoptions(formatter={'int':hex})

# I assume, a has the len 2*n  and b has the len n (for conversion from 2*n Bytes in n 2Bytes)
a = np.array([0x31, 0x41, 0x59, 0x26, 0x53, 0x58, 0x97, 0x93]).astype(np.uint8)
b = np.array([(a[2*i]<<8)+a[2*i+1] for i in range(0, len(a) // 2)]).astype(np.uint16)

print("a: {}".format(a)) # a: [0x31 0x41 0x59 0x26 0x53 0x58 0x97 0x93]
print("b: {}".format(b)) # b: [0x3141 0x5926 0x5358 0x9793]

我需要非常大的数组(或多或少),所以我问这是否有可能在Python中更有效。

b = a.view(np.uint16)

这是危险且容易出错的操作。 请记住,在C ++中应注意的所有相同注意事项,例如字节序。 您还需要担心其他警告,例如不连续的数组内存布局。 至少严格的别名是“其他人的问题”。 该实现可能违反了C严格的别名规则,但是希望它们设置了编译器标志或某些东西来获得定义的行为。 uint8unsigned char ,因此严格的别名不适用,但是ndarray.view也允许uint64 > float64重新解释之类的东西。)

我实际上不建议这样做( @user2357112已经解释了原因 ),但是您也可以手动更改(设置) 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM