gpt4 book ai didi

python - Numpy astype "upcasting"数组而不是跨列应用数据类型

转载 作者:太空宇宙 更新时间:2023-11-03 14:00:18 24 4
gpt4 key购买 nike

我有一个二维 numpy 数组,我想将特定的 dtype 应用于每一列。

a = np.arange(25).reshape((5,5))

In [40]: a
Out[40]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])

In [41]: a.astype(dtype=[('width', '<i4'), ('height', '<i4'), ('depth', '<i4'), ('score', '<f4'), ('auc', '<f4')])

我期待第 41 行应用我想要的 dtype,但它通过创建一个新轴“向上转换”,为每个 dtype 复制整个数组一次:

Out[41]: 
array([[(0, 0, 0, 0.0, 0.0), (1, 1, 1, 1.0, 1.0), (2, 2, 2, 2.0, 2.0),
(3, 3, 3, 3.0, 3.0), (4, 4, 4, 4.0, 4.0)],
[(5, 5, 5, 5.0, 5.0), (6, 6, 6, 6.0, 6.0), (7, 7, 7, 7.0, 7.0),
(8, 8, 8, 8.0, 8.0), (9, 9, 9, 9.0, 9.0)],
[(10, 10, 10, 10.0, 10.0), (11, 11, 11, 11.0, 11.0),
(12, 12, 12, 12.0, 12.0), (13, 13, 13, 13.0, 13.0),
(14, 14, 14, 14.0, 14.0)],
[(15, 15, 15, 15.0, 15.0), (16, 16, 16, 16.0, 16.0),
(17, 17, 17, 17.0, 17.0), (18, 18, 18, 18.0, 18.0),
(19, 19, 19, 19.0, 19.0)],
[(20, 20, 20, 20.0, 20.0), (21, 21, 21, 21.0, 21.0),
(22, 22, 22, 22.0, 22.0), (23, 23, 23, 23.0, 23.0),
(24, 24, 24, 24.0, 24.0)]],
dtype=[('width', '<i4'), ('height', '<i4'), ('depth', '<i4'), ('score', '<f4'), ('auc', '<f4')])

为什么会发生这种情况,因为 dtype 的数量与列的数量相匹配(所以我没想到向上转型)?

如何按照我在第 41 行中的意图,获取内存中的现有数组并应用每列数据类型?谢谢。

最佳答案

作为@senderle正确地指出,您很少需要 view,但这里有一个可能的解决方案,几乎就地执行此操作只是为了好玩。您需要做的唯一修改是确保您的类型都具有相同的大小。

a = np.arange(25, dtype='<i4').reshape((5,5))
b = a.view(dtype=[('width', '<i4'), ('height', '<i4'), ('depth', '<i4'), ('score', '<f4'), ('auc', '<f4')])
b['score'] = a[:, -2, np.newaxis].astype('<f4')
b['auc'] = a[:, -1, np.newaxis].astype('<f4')

如果我们要做不推荐的事情,你也可以在获取 View 后插入一行 b.shape = (5,) 来消除 a< 保留的额外维度,并使下面的分配更简单。

这将为您提供一个 View b,它具有所有需要的属性,但当然会弄乱 a 的内容:

>>> a
array([[ 0, 1, 2, 1077936128, 1082130432],
[ 5, 6, 7, 1090519040, 1091567616],
[ 10, 11, 12, 1095761920, 1096810496],
[ 15, 16, 17, 1099956224, 1100480512],
[ 20, 21, 22, 1102577664, 1103101952]])
>>> b
array([[( 0, 1, 2, 3., 4.)],
[( 5, 6, 7, 8., 9.)],
[(10, 11, 12, 13., 14.)],
[(15, 16, 17, 18., 19.)],
[(20, 21, 22, 23., 24.)]],
dtype=[('width', '<i4'), ('height', '<i4'), ('depth', '<i4'), ('score', '<f4'), ('auc', '<f4')])

关于python - Numpy astype "upcasting"数组而不是跨列应用数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50100246/

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