在 python 中循环追加 numpy 数组元素

Loop append of numpy array element in python

谁能解释一下如何按条件循环添加一个元素到numpy数组中?

我写了一些代码,如果数组 A 的第 i 个元素是 0,应该添加元素 2,如果数组 [=] 的第 i 个元素,则添加元素 1 16=] 不是 0.

这是代码本身:

import numpy as np
def finalconcat(somearray):
  for i in somearray:
    arraysome=[]
    if somearray[i]==0:
      arraysome=np.append(arraysome,[2],axis=0)
    else:
      arraysome=np.append(arraysome,[1],axis=0)
  return arraysome

举个例子:

A=np.array([1,0,2,3,4,5])
C=finalconcat(B)
print(C)

应该出来了:

[1,2,1,1,1,1]

但结果是这样的:

[1.]

请向我解释这里出了什么问题,我只是不明白哪里出了问题...

您有几个问题:

  1. arraysome=[] 在您的循环中,因此对于 somearray 的每次迭代,您都在清空 arraysome。因此,当你全部完成时,你永远不会在 arraysome 中得到一个以上的元素。
  2. 你有 for i in somearray。在每次迭代中 i 将是 somearray 的下一个元素;它将 而不是 迭代数组的 indices。但后来你有 if somearray[i]==0:。这应该只是 if i==0:.
  3. 如果您希望 arraysome 的结果元素是整数而不是浮点数,那么您应该将其初始化为一个 numpy 整数数组。
  4. 您有 C=finalconcat(B),但 B 未定义。
  5. 你真的应该花点时间阅读 PEP 8 – Style Guide for Python Code
import numpy as np

def finalconcat(somearray):
    arraysome = np.array([], dtype=np.int)
    for i in somearray:
        if i == 0:
            arraysome = np.append(arraysome, [2], axis=0)
        else:
            arraysome = np.append(arraysome, [1], axis=0)
    return arraysome

a = np.array([1, 0, 2, 3, 4, 5])
c = finalconcat(a)
print(c)

打印:

[1 2 1 1 1 1]

对于这样的迭代,最好使用列表。 np.append 只是 np.concatenate 的一个命名不当的封面,returns 每次调用都是一个全新的数组。列表追加工作 in-place,而且效率更高。更易于使用:

def finalconcat(somearray):
  rec = [2 if i==0 else 1 for i in somearray]
  # arr = np.array(rec)
  return rec

In [31]: a = np.array([1, 0, 2, 3, 4, 5])
In [32]: np.array([2 if i==0 else 1 for i in a])
Out[32]: array([1, 2, 1, 1, 1, 1])

但是最好用whole-array的方法,比如:

In [33]: b = np.ones_like(a)
In [34]: b
Out[34]: array([1, 1, 1, 1, 1, 1])
In [35]: b[a==0] = 2
In [36]: b
Out[36]: array([1, 2, 1, 1, 1, 1])

In [37]: np.where(a==0, 2, 1)
Out[37]: array([1, 2, 1, 1, 1, 1])