gpt4 book ai didi

python - View 不适用于转置数组

转载 作者:行者123 更新时间:2023-11-28 21:58:56 24 4
gpt4 key购买 nike

为什么会这样:

>>> f = np.array(([[10,20],[11,21],[11,21],[12,22],[13,23]]))
>>> f
array([[10, 20],
[11, 21],
[11, 21],
[12, 22],
[13, 23]])
>>> f.view([('',f.dtype)]*f.shape[1])
array([[(10, 20)],
[(11, 21)],
[(11, 21)],
[(12, 22)],
[(13, 23)]],
dtype=[('f0', '<i8'), ('f1', '<i8')])

但这不是:

>>> f = np.array(([10,11,11,12,13],[20,21,21,22,23])).T
>>> f
array([[10, 20],
[11, 21],
[11, 21],
[12, 22],
[13, 23]])
>>> f.view([('',f.dtype)]*f.shape[1])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: new type not compatible with array.

最佳答案

您的 numpy 数组默认存储在内存中的单个连续 block 中 row major order .定义结构化数组时,所有字段在内存中也必须是连续的。在您的情况下,您需要将每一行存储在内存中的连续位置。当您转置数组时,不会改变数据,只会改变步幅,这意味着现在它是存储在内存中连续位置的列。

虽然它可能需要复制数据,这很慢,但安全的方法是在执行结构数组魔术之前调用 np.ascontiguousarray:

>>> f = np.array([[10,11,11,12,13],[20,21,21,22,23]]).T
>>> f = np.ascontiguousarray(f)
>>> f.view([('',f.dtype)]*f.shape[1])
array([[(10, 20)],
[(11, 21)],
[(11, 21)],
[(12, 22)],
[(13, 23)]],
dtype=[('f0', '<i4'), ('f1', '<i4')])

关于python - View 不适用于转置数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17409122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com