我写了一些简单的代码来遍历正在分析的一组列表(从b1到b20)。对于这些列表,我想先检查其中哪些是空的。对于那些空的,我想将值添加0。我想将0添加到空列表,因为稍后我将对不同列表中的值进行总计,据我所知,我无法将以下列表加在一起:空的。
此刻,我有以下代码:
for z in np.arange(1,21):
r=np.array([0])
rate = eval('b' + str(z))
print (z)
if len(rate)==0:
rate.concatenate(r)
print (rate)
else:
print (rate)
order_x20=b16+c16+d16+h16+i16
order_x2020=b17+c17+d17+h17+i17
order_x2050=b15+c15+d15+h15+i15
order_x20100=b2+c2+d2+h2+i2
order_x20300=b20+c20+d20+h20+i20
每次运行代码时,都会出现以下错误:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-37-876cc7bddcdf> in <module>
2200 print (z)
2201 if len(rate)==0:
-> 2202 rate.concatenate(r)
2203 print (rate)
2204 else:
AttributeError: 'numpy.ndarray' object has no attribute 'concatenate'
有人可以帮我解决问题吗?我真的不明白为什么会收到此错误,但是我认为是由于无法将np.append()
或np.concatenate()
与eval()
函数一起使用?
答案 0 :(得分:0)
要串联两个numpy数组,必须写rate = np.concatenate(rate,r,axis=0/1)
,这取决于要串联两个数组的方式。
答案 1 :(得分:0)
Docstring:
concatenate((a1, a2, ...), axis=0, out=None)
a1, a2, ... : sequence of array_like
The arrays must have the same shape, except in the dimension
corresponding to `axis` (the first, by default).
这是一个函数,而不是方法。称为np.concatenate
。
第一个参数是数组(或类似数组)的元组(或更通常的序列)。如果用np.concatenate(a1, a2)
调用,则a2
将被解释为axis
参数,该参数必须是一个简单的数字!
不要使用np.concatenate
(或np.append
),就像它是列表append
的克隆一样。 alist.append(r)
是一个方法调用,并就地执行。 numpy
函数是functions
,不能就地执行。他们返回一个新数组。如果在循环中重复使用它们,效率会大大降低。
从您的描述来看,这听起来像一个简单的列表理解问题:
In [14]: alist = [[1,2],[],[2,3],[],[],[4]]
In [15]: newlist = [i if len(i) else [0] for i in alist]
In [16]: newlist
Out[16]: [[1, 2], [0], [2, 3], [0], [0], [4]]
或写为for循环:
In [20]: newlist = []
...: for i in alist:
...: if len(i)==0:
...: i = [0]
...: newlist.append(i)
此列表可以通过以下一个(正确的)np.concatenate
调用变成一个数组:
In [22]: np.concatenate(newlist)
Out[22]: array([1, 2, 0, 2, 3, 0, 0, 4])