'numpy.ndarray'对象没有属性'concatenate'错误

时间:2019-10-21 11:15:52

标签: python numpy eval

我写了一些简单的代码来遍历正在分析的一组列表(从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()函数一起使用?

2 个答案:

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