2015-12-15 2 views
-2

У меня есть некоторые проблемы. Я хочу вычесть один список из другого. Для этого я использую преобразование из массива python в массив numpy. Но это провалилось. Например, wealthRS - это список. Я создаю копию: wealthRSCopy = wealthRS Тогда я хочу использовать, но это ошибка (unsuppoerted operand types) Вот скриншот. enter image description herePython Numpy неподдерживаемые типы операндов 'list' - 'list'

+3

Пожалуйста, размещайте фактический код и вывод, скриншоты не очень полезны. – SiHa

+0

Вы имеете в виду разницу в значении? http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.subtract.html – msw

ответ

1

Редактировать с ответом:

Вы первоначальные списки есть списки, как и их элементов. Эти списки имеют разную длину, поэтому приведение в массив NumPy массивов объекта dtype, т. Е. Элементы ваших массивов - это списки. См. Здесь: https://stackoverflow.com/a/33987165/4244912

При вычитании массивов NumPy выполняется элементное вычитание, т. Е. Вычитает элементы (которые в вашем случае являются списками) одного массива из соответствующих элементов в другом, и именно поэтому вы получаете сообщение об ошибке (т.е. вычитание не поддерживается для списка типов).

Быстрый пример:

In [1]: import numpy as np 

In [2]: A=np.array([[1,2],[],[1,2,3,4]]) 

In [3]: A[0] 
Out[3]: [1, 2] 

In [4]: A[0].append(3) #<-- The first element is a list! 

In [5]: A 
Out[5]: array([[1, 2, 3], [], [1, 2, 3, 4]], dtype=object) #<-- The first element (a list) has changed. 

Здесь я воспроизвести вашу ошибку:

In [35]: B, C = np.array([[1,2],[3]]), np.array([[4,5],[6]]) # Note the differing sizes of the nested lists. 

In [36]: C-B 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-36-f4554df570db> in <module>() 
----> 1 C-B 

TypeError: unsupported operand type(s) for -: 'list' and 'list' 

Таким образом, вы должны убедиться, что вы можете здраво бросить свои списки массивов, делая каждый список с исходными списками равная длина. Затем они должны быть приведены к массивам NumPy с dtype float и действовать так, как вы ожидаете.

Оригинальное сообщение

Я не думаю, что ваш фрагмент кода создает копию, и это выглядит, как вы все еще вычитая списки, не Numpy массивы.

Если wealthRS - это список, то wealthRSCopy = wealthRS создает то, что я считаю, называется мелкой копией: списки относятся к тем же элементам, поэтому изменение одного изменит другое.

Например:

In [1]: a = [1,2,3] 

In [2]: b = a 

In [3]: b[0] = 10 # change the first item in 'b' 

In [4]: b 
Out[4]: [10, 2, 3] 

In [5]: a # <-- 'a' has changed too! 
Out[5]: [10, 2, 3] 

Один из способов создания копий, которые не зависят друг от друга является использование ломтиками.

In [6]: c = a[:] # <-- slice containing the whole list 

In [6]: c[0] = 15 

In [7]: a 
Out[7]: [10, 2, 3] 

In [8]: c 
Out[8]: [15, 2, 3] 

Редактировать: Для остальной части вашего вопроса: Не могли бы вы попробовать это для меня?

In [1]: import numpy as np 

In [2]: a, b = [[[1]]], [[[3]]] 

In [3]: np.array(b) - np.array(a) 
Out[3]: array([[[2]]]) 

Я не могу понять, почему ваше вычитание не не работает, если элементы массива является списками сам, но я не знаю, как это могло произойти.

Смежные вопросы