Numpy字符串数组,值分配

3

我正在使用填充有字符串的numpy数组。我的目标是将第二个小一些的数组b中包含的值分配给第一个数组a的一个切片。

我设想的实现如下:

import numpy as np

a = np.empty((10,), dtype=str)

b = np.array(['TEST' for _ in range(2)], dtype=str)

print(b)

a[1:3] = b

print(a)

print(b) 的输出结果如预期的是 ['TEST' 'TEST']

但是 print(a) 的输出结果是 ['' 'T' 'T' '' '' '' '' '' '' '']。因此从b中的值没有被正确分配到 a的切片中。

有任何想法是什么导致了这种奇术出现?

谢谢!

2个回答

5
你可以将其看作一种溢出形式。
查看你的数组的确切类型:
>>> a.dtype
dtype('<U1') # Array of 1 unicode char
>>> b.dtype
dtype('<U4') # array of 4 unicode chars

当您定义一个字符串数组时,numpy 会尝试推断可以包含您定义的所有元素的最小字符串大小。

  • 对于 a ,1个字符足矣
  • 对于 bTEST 是4个字符长

然后,当您为字符串数组的任何新元素分配新值时,numpy 将截断新值以适应数组的容量。在这里,它仅保留 TEST 的第一个字母 T

您的切片操作与此无关:

a = np.zeros(1, dtype=str)
a[0] = 'hello world'
print(a[0])
# h

如何克服它

  1. 使用对象类型定义a:NumPy将不再尝试优化其存储空间,您将获得可预测的行为
  2. 增加字符数组的大小a = np.zero(10, dtype='U256')将增加每个单元格的容量到256个字符

2
谢谢! 啊哈哈,真巧!感谢你的回复,希望你一切都好! - pierresegonne
不用谢!这次相遇确实很少见 :) 你也要保重! - Grégoire Roussel

2
问题在于当指定dtype=str时,numpy会将字符串截断为长度1
您可以通过使用dtype='<U4'来解决这个问题。
因此,以下代码适用于您的情况:
import numpy as np

a = np.empty((10,), dtype='<U4')

b = np.array(['TEST' for _ in range(2)], dtype=str)

print(b)

a[1:3] = b

print(a)
< p > dtype='<U4' 中的数字指定该数组中字符串的最大可能长度 - 因此对于您的情况,4 是可以的,因为'TEST'只有4个字母。


谢谢!你知道背后的原因吗? - pierresegonne
NumPy试图尽可能地提高效率,如果它要使用动态内存分配来存储任意长度的字符串,那么这将比现在的行为(可以预先分配内存)花费更长的时间。 - sempersmile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接