Объект 'numpy.ndarray' не имеет атрибута 'concatenate' error - PullRequest
0 голосов
/ 21 октября 2019

Я написал простой код для перебора группы списков, которые я анализирую (от 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 голосов
/ 21 октября 2019
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])
0 голосов
/ 21 октября 2019

Чтобы объединить два пустых массива, вы должны написать rate = np.concatenate(rate,r,axis=0/1), в зависимости от того, как вы хотите объединить два массива.

...