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



谁能解释如何按条件向numpy数组循环添加元素?

我写了一些代码,如果数组A的I个元素是0,就应该添加元素2;如果数组A的I个元件不是0,就应该增加元素1

这是代码本身:

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。在每次迭代中,CCD_ 12将是CCD_ 13的下一个元素;它将而不是迭代数组的索引。但后来你有了if somearray[i]==0:。这应该只是if i==0:
  3. 如果希望arraysome的结果元素是整数而不是浮点,那么应该将其初始化为整数的numpy数组
  4. 您有C=finalconcat(B),但未定义B
  5. 您真的应该花些时间阅读PEP8–Python代码风格指南
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的一个名称不太好的封面,它每次调用都会返回一个全新的数组。列表附加工作到位,而且效率更高。更易于使用:

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])

但最好使用整个数组的方法,例如:

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])

最新更新