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