将元素追加到二维Numpy数组

zqdjd7g9  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(163)

我有一个形状为(500, 151296)的数值数组。下面是数组格式
阵列:

array([[-0.18510018,  0.13180602,  0.32903048, ...,  0.39744213,
        -0.01461623,  0.06420607],
       [-0.14988784,  0.12030973,  0.34801325, ...,  0.36962894,
         0.04133283,  0.04434045],
       [-0.3080041 ,  0.18728344,  0.36068922, ...,  0.09335024,
        -0.11459247,  0.10187756],
       ...,
       [-0.17399777, -0.02492459, -0.07236133, ...,  0.08901921,
        -0.17250113,  0.22222663],
       [-0.17399777, -0.02492459, -0.07236133, ...,  0.08901921,
        -0.17250113,  0.22222663],
       [-0.17399777, -0.02492459, -0.07236133, ...,  0.08901921,
        -0.17250113,  0.22222663]], dtype=float32)

数组[0]:

array([-0.18510018,  0.13180602,  0.32903048, ...,  0.39744213,
       -0.01461623,  0.06420607], dtype=float32)

我还有另一个列表,它的停用词大小与NumPy数组形状相同
停用词=[‘no’,‘not’,‘in’......]
我想将每个停顿字添加到有500个元素的NumPy数组中。下面是我用来添加的代码

for i in range(len(stopwords)):
  array = np.append(array[i], str(stopwords[i]))

我收到以下错误

IndexError                                Traceback (most recent call last)
<ipython-input-45-361e2cf6519b> in <module>
      1 for i in range(len(stopwords)):
----> 2   array = np.append(array[i], str(stopwords[i]))

IndexError: index 2 is out of bounds for axis 0 with size 2

所需输出:
数组[0]:

array([-0.18510018,  0.13180602,  0.32903048, ...,  0.39744213,
       -0.01461623,  0.06420607, 'no'], dtype=float32)

有人能告诉我我哪里做错了吗?

dw1jzc5e

dw1jzc5e1#

您所做的错误是覆盖了for循环中的变量array

for i in range(len(stopwords)):
    array = np.append(array[i], str(stopwords[i]))

# ^^^^^             ^^^^^

但是,在for循环中使用np.append也是错误的,这几乎总是一个坏主意。
你可以做类似这样的事情:

from string import ascii_letters
from random import choices

import numpy as np

N, M = 50, 7
arr = np.random.randn(N, M)
stopwords = np.array(["".join(choices(ascii_letters, k=10)) for _ in range(N)])
result = np.concatenate([arr, stopwords[:, None]], axis=-1)

assert result.shape == (N, M+1)
print(result[0])  # ['0.1' '-1.2' '-0.1' '1.6' '-1.4' '-0.2' '1.7' 'ybWyFlqhcS']

但它也是错误的,在没有明显原因的情况下混合数据类型。
我想,你最好还是留着这两个数组吧。
根据您正在做的事情,您可以按如下方式迭代它们:

for vector, stopword in zip(arr, stopwords):
    print(f"{stopword = }")
    print(f"{vector   = }")

# stopword = 'RgfTVGzPOl'

# vector   = array([-0.9,  1.1,  0.7 , -0.3 , -0.7 , -0.7, -0.6])

# 

# stopword = 'XlJqKdsvCC'

# vector   = array([-0.5,  0.1, -0.7 , -0.6, -1.1, -0.6, -0.6])

# 

# ...
8ulbf1ek

8ulbf1ek2#

让我们来试一试调试。
从较小的浮点数组开始:

In [76]: arr = np.arange(12).reshape(3,4).astype(float)    
In [77]: arr
Out[77]: 
array([[ 0.,  1.,  2.,  3.],
       [ 4.,  5.,  6.,  7.],
       [ 8.,  9., 10., 11.]])

In [78]: words = ['no','not','in']

In [79]: for i in range(3):
    ...:     arr = np.append(arr[i], str(words[i]))
    ...:     
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Input In [79], in <cell line: 1>()
      1 for i in range(3):
----> 2     arr = np.append(arr[i], str(words[i]))

IndexError: index 2 is out of bounds for axis 0 with size 2

出现错误时,请查看iarr

In [80]: arr
Out[80]: array(['1.0', 'not'], dtype='<U3')    
In [81]: i
Out[81]: 2

arr看起来一点也不像原来的arr,不是吗?它是一个一维数组,有两个字符串元素。是arr[2]引发了错误。你明白为什么吗?
重新创建arr,然后只执行一个步骤:

In [82]: arr = np.arange(12).reshape(3,4).astype(float)
In [83]: np.append(arr[0], words[0])
Out[83]: array(['0.0', '1.0', '2.0', '3.0', 'no'], dtype='<U32')

这看起来有点像您想要的第一行,只是它是字符串dtype。但是您不想用这个一维数组替换原来的arr,对吗?
对此结果执行i=1步骤会产生

In [84]: np.append(Out[83][1], words[1])
Out[84]: array(['1.0', 'not'], dtype='<U3')

这是i=2遇到问题的数组(一个形状(2,)数组)。
不要在遇到错误时绝望地举手--通过查看变量并一步一步地测试代码来进行调试。
您尝试的迭代类型确实适用于列表:

In [85]: alist = arr.tolist()  
In [86]: alist
Out[86]: [[0.0, 1.0, 2.0, 3.0], [4.0, 5.0, 6.0, 7.0], [8.0, 9.0, 10.0, 11.0]]

In [87]: for i in range(3):
    ...:     alist[i].append(words[i])
    ...:     

In [88]: alist
Out[88]: 
[[0.0, 1.0, 2.0, 3.0, 'no'],
 [4.0, 5.0, 6.0, 7.0, 'not'],
 [8.0, 9.0, 10.0, 11.0, 'in']]

列表元素的长度可以不同;列表追加可以就地工作;列表可以包含数字和字符串。所有这些都不适用于NumPy数组。
一般来说,尝试用NumPy数组复制List方法是行不通的。

相关问题