【问题标题】:Numpy Append Data to an empty arrayNumpy 将数据追加到一个空数组
【发布时间】:2022-01-24 10:19:18
【问题描述】:

我正在尝试编写将添加 2 个数组(逐个元素)并将它们存储在第三个数组中的代码。

基本逻辑:

arr3[i] = arr1[i] + arr2[i]

为此,我创建了两个数组arr1arr2。 arr1 和 arr2 之和的结果被附加到一个空数组arr3

代码:

from numpy import append, array, int8


arr1 = array([1,2,3,4,5])

arr2 = array([2,4,6,8,10])

len = max(arr1.size,arr2.size)

arr3 = array([],dtype=int8)

for i in range(len):
    append(arr3,arr1[i]+arr2[i])
    print(arr1[i]+arr2[i])
    print(arr3[i])

print(arr3)

在这段代码中,我可以引用 arr1 和 arr2 的元素并添加它们,但我无法将数据附加到 arr3。

谁能帮我理解,代码中的错误是什么导致我无法将数据存储到arr3?

【问题讨论】:

  • 这种迭代和追加适用于 python 列表。 numpy 数组是错误的。

标签: python arrays numpy


【解决方案1】:

你可以简单地使用

arr3 = arr1 + arr2

您的代码不起作用的原因是append 不会改变数组,而是返回一个新数组。您可以像这样简单地修改您的代码:

for i in range(len):
    arr3 = append(arr3,arr1[i]+arr2[i])

【讨论】:

  • 感谢@sagi 的回答。由于我一直在研究 Java,并且正在学习 Python,因此我首先尝试编写没有内置函数的代码。如果可能的话,您能否建议一种方法,以便我可以在不使用内置函数的情况下将 sum 的结果存储在 arr3 中
  • 嗯,我不确定我是否理解.. 我的例子有什么问题?
  • 您的回答没有错,对于有经验的开发人员来说,这种添加数组元素的方式非常棒。只是这个答案是专门针对 python 的,例如如果我尝试用 Java 编写 arr3 = arr1 + arr2,我会得到一个错误。所以我问这个程序是否可以在不使用 for 循环等内置函数的情况下编写,以便它可以充当我对 Java 和 Python 的理解之间的桥梁
【解决方案2】:

这可能会导致索引错误:

max(arr1.size,arr2.size)

如果数组不同,range 会产生对于较小数组来说太大的索引值。

对两个数组求和的直接方法是

In [79]: arr1 = np.array([1,2,3,4,5])
    ...: arr2 = np.array([2,4,6,8,10])
In [80]: arr1+arr2
Out[80]: array([ 3,  6,  9, 12, 15])

它充分利用了numpy 数组定义,速度最快。

如果您必须迭代(例如,因为您想从错误中吸取教训),请使用类似的东西(如果输入是列表而不是数组,这实际上更好):

In [86]: alist = []
    ...: for x,y in zip(arr1,arr2):
    ...:     alist.append(x+y)
    ...: 
In [87]: alist
Out[87]: [3, 6, 9, 12, 15]

或者更好的列表理解

In [88]: [x+y for x,y in zip(arr1,arr2)]
Out[88]: [3, 6, 9, 12, 15]

我正在使用zip 而不是arr1[i] 类型的范围索引。它更简洁,并且不太可能产生错误。

np.append,尽管有名称,但 不是 列表 append 克隆。阅读np.append 文档,如有必要,请重新阅读。

append : ndarray
        A copy of `arr` with `values` appended to `axis`.  Note that
        `append` does not occur in-place: a new array is allocated and
        filled.  If `axis` is None, `out` is a flattened array.

这确实有效,但速度较慢:

In [90]: arr3 = np.array([])
    ...: for x,y in zip(arr1,arr2):
    ...:     arr3 = np.append(arr3,x+y)
    ...: 
In [91]: arr3
Out[91]: array([ 3.,  6.,  9., 12., 15.])

我想删除np.append,因为它误导了太多初学者。

这样的迭代非常适合列表,但最好在使用 numpy 数组时避免。学习使用已定义的 numpy 运算符和方法,并仅将元素迭代作为最后的手段。

【讨论】:

  • 感谢分享您的代码,但它不会将数据附加到 arr3
  • 我的最后一个示例确实将值附加到arr3,而不是我推荐使用它。
【解决方案3】:

第一件事

不要使用内置函数名作为变量

len是python的内置函数。

@sagi 的回答是对的。编写 for 循环意味着您的代码没有经过时间优化。

但如果你仍然想了解你的代码哪里出错了,请检查数组形状

import numpy as np
arr3 = np.array([],dtype=int8)
print (arr3.shape)
>>> (0,) 

也许您可以创建一个与arr1arr2 形状相同的空数组。对于您的问题,它们似乎具有相同的维度。

arr3 = np.empty(arr1.shape, dtype=arr1.dtype)
arr3[:] = arr1 + arr2

如果你仍然坚持使用可怕的for 循环和append,那么使用这个--

list3 = []
for x, y in zip(arr1, arr2):
   list3.append(x+y)
arr3 = np.asarray(list3)
print(arr3)
>>> array([ 3,  6,  9, 12, 15])

干杯,祝你好运!!

【讨论】:

  • 你最后一个使用np.append 的例子不正确,它不会改变arr3
猜你喜欢
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 2021-07-14
  • 2013-11-07
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 2017-07-22
相关资源
最近更新 更多