如何使用特定的 dtype 填充现有的 numpy 数组

2024-02-14

假设我有一个带有固定数据类型的初始 numpy 数组:

array = numpy.array([(1, 'a'), (2, 'b')],
                    numpy.dtype([('idfield',numpy.int32),
                                 ('textfield', '|S256')]))

现在我需要在 for 循环中填充这个数组,所以我这样做

for val in value:
    array = np.append(array, np.array([(val[0],val[1])],numpy.dtype([('idfield',numpy.int32),
                                                                     ('textfield', '|S256')])),axis=0)

它有效,但看起来确实不太好!我需要在 for 循环中重新指定 dtype,即使逻辑上我将使用相同的 dtype 来填充我的数组。

您知道实现此操作的更简单方法吗?


np.append是一个简单的封面np.concatenate

def append(arr, values, axis=None):
    arr = asanyarray(arr)
    if axis is None:
        if arr.ndim != 1:
            arr = arr.ravel()
        values = ravel(values)
        axis = arr.ndim-1
    return concatenate((arr, values), axis=axis)

In [89]: dt = np.dtype('U5,int')
In [90]: arr = np.array([('one',1)], dtype=dt)
In [91]: np.append(arr, ('two',2))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-91-bc17d9ad4a77> in <module>()
----> 1 np.append(arr, ('two',2))
 ...
-> 5166     return concatenate((arr, values), axis=axis)

TypeError: invalid type promotion

在这种情况下它确实

In [92]: np.ravel(('two',2))
Out[92]: array(['two', '2'], dtype='<U3')

将元组转换为 2 元素字符串 dtype 数组。现在concatenate尝试加入一个数组dtU3数组,但不能。里面什么都没有append使用arr.dtype作为车削的基础values到一个数组中。你需要自己做。numpy只能做这么多来推断你的意图。 :)

因此,如果您指定 common dtype 它就可以工作:

In [93]: np.append(arr, np.array(('two',2),dt))
Out[93]: array([('one', 1), ('two', 2)], dtype=[('f0', '<U5'), ('f1', '<i4')])

我不喜欢append因为新用户经常误用它。通常他们将其视为列表追加克隆,但事实并非如此。

但它确实有一个优点 - 它提高了 0d 输入的维度:

In [94]: np.concatenate([arr, np.array(('two',2),dt)])
...
ValueError: all the input arrays must have same number of dimensions

使第二个数组 1d 有效:

In [95]: np.concatenate([arr, np.array([('two',2)],dt)])
Out[95]: array([('one', 1), ('two', 2)], dtype=[('f0', '<U5'), ('f1', '<i4')])

append隐藏尺寸调整concatenate needs.

但如果可能的话,最好创建一个数组(或元组)列表并执行concatenate就一次:

In [96]: alist = [('one',1),('two',2),('three',3)]
In [97]: ll = [np.array([x],dt) for x in alist]
In [98]: ll
Out[98]: 
[array([('one', 1)], dtype=[('f0', '<U5'), ('f1', '<i4')]),
 array([('two', 2)], dtype=[('f0', '<U5'), ('f1', '<i4')]),
 array([('three', 3)], dtype=[('f0', '<U5'), ('f1', '<i4')])]

In [100]: np.concatenate(ll)
Out[100]: 
array([('one', 1), ('two', 2), ('three', 3)],
      dtype=[('f0', '<U5'), ('f1', '<i4')])

但是直接从元组列表创建数组更好:

In [101]: np.array(alist, dt)
Out[101]: 
array([('one', 1), ('two', 2), ('three', 3)],
      dtype=[('f0', '<U5'), ('f1', '<i4')])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用特定的 dtype 填充现有的 numpy 数组 的相关文章

随机推荐