numpy数组元数据更改

2024-10-06 12:45:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道numpy在连续内存中存储数字。那么有没有可能

a = np.array([127,127,127,127,127,127,127,127], dtype=np.uint8)

“a”的二进制表示形式是全1

为此:

b = np.array([72057594037927935], dtype=np.uint64)

以及从b->;a

二进制表示法为全1,但元素数合并为一个64位整数 Numpy中的表示形式应相同,但元数据应更改

这听起来像是一个跨步技巧的工作,但我最好的猜测是:

np.lib.stride_tricks.as_strided(a, shape=(1,), strides=(8,8))

np.lib.stride_tricks.as_strided(b, shape=(8,), strides=(1,8))

仅获取ValueError:步幅长度和形状不匹配

这只需要是只读的,这样我就不会误以为我需要更改数据


Tags: 数据内存numpylibasnp二进制array
1条回答
网友
1楼 · 发布于 2024-10-06 12:45:06

如果要重新解释数组中的现有数据,则需要^{}。这就是.astype.view之间的主要区别(即前者转换为新类型,保留,而后者保持相同的内存并更改其解释方式):

import numpy as np 

a = np.array([127,127,127,127,127,127,127,127], dtype=np.uint8)
b = a.view(np.uint64) 
print(a) 
print(b) 
print(b.view(np.uint8))                                        

这个输出

[127 127 127 127 127 127 127 127]
[9187201950435737471]
[127 127 127 127 127 127 127 127]

注意127在其二进制模式中有一个前导零,因此它不是所有的,这就是为什么我们在b中得到的值与您期望的不同:

>>> bin(b[0])
'0b111111101111111011111110111111101111111011111110111111101111111'

>>> bin(72057594037927935)
'0b11111111111111111111111111111111111111111111111111111111'

您似乎假设的是一组1位的uint7

无论如何,.view最好的部分是,除非您显式复制,否则将使用完全相同的内存块:

>>> b.base is a
True

当然,推论是突变b会影响a

>>> b += 3

>>> a
array([130, 127, 127, 127, 127, 127, 127, 127], dtype=uint8)

要控制尾端,您需要使用string-valued dtype specifications,即a.view('<u8')(小尾端)或a.view('>u8')(大尾端)。我们可以用它重现您问题中的错误编号:

>>> a2 = np.array([0] + [255] * 7, dtype=np.uint8)
... a2.view('>u8')
array([72057594037927935], dtype=uint64)

相关问题 更多 >