谁能解释如何按条件向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.]
请向我解释一下这里出了什么问题,我只是不明白哪里可能出了问题。。。
您有几个问题:
arraysome=[]
在您的循环中,因此对于somearray
的每次迭代,您都在清空arraysome
。因此,当您全部完成时,arraysome
中永远不会出现多个元素- 你有
for i in somearray
。在每次迭代中,CCD_ 12将是CCD_ 13的下一个元素;它将而不是迭代数组的索引。但后来你有了if somearray[i]==0:
。这应该只是if i==0:
- 如果希望
arraysome
的结果元素是整数而不是浮点,那么应该将其初始化为整数的numpy
数组 - 您有
C=finalconcat(B)
,但未定义B
- 您真的应该花些时间阅读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])