Умножение ndarray на скаляр: TypeError: неверное продвижение типа - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь умножить каждый столбец в ndarray на скаляр. Когда я пытаюсь сделать это, я получаю ошибку TypeError: invalid type promotion.

Я пытался использовать array.astype(float), но это дает все NaN с.

array = np.genfromtxt("file.csv", dtype=float, delimiter='\t', names=True)

newarray = array*4.0

file.csv имеет несколько заголовков столбцов. Например:

array['col_a'] = [5.0, 6.0]

После умножения на скаляр, я хочу: newarray['col_a'] будет [20.0, 24.0]

1 Ответ

0 голосов
/ 12 января 2019

Я искренне удивлен, что это никогда не встречалось в моем собственном коде, но оказывается, что структурированные массивы Numpy (т.е. массивы с именами полей) не поддерживают стандартные арифметические операторы +, -, * или / (см. Сноску *).

Таким образом, ваш единственный вариант - работать с неструктурированной версией вашего массива. Комментарий @ hpaulj указывает, как вы можете это сделать ( этот старый ответ содержит подробное исследование того, как именно вы можете получить дополнение для работы со структурированными массивами.). Либо индексировать отдельное поле (результат которого ведет себя как стандартный массив), и умножить это:

import numpy as np
from io import StringIO

csv = '''col_a\tcol_b\tcol_c
5.0\t19.6\t22.8
6.0\t42.42\t39.208
'''

arr = np.genfromtxt(StringIO(csv), dtype=np.float64, delimiter='\t', names=True)

xcol_a = arr['col_a']*4
print(xcol_a)
# output: [20. 24.]

или пропустите names=True kwarg при создании массива (что заставляет np.genfromtxt возвращать стандартный массив вместо структурированного):

arrstd = np.genfromtxt(StringIO(csv), dtype=np.float64, delimiter='\t', skip_header=True)

print(arrstd*4)
# output: [[ 20.     78.4    91.2  ]
#          [ 24.    169.68  156.832]]

*: Технически представляется, что многие встроенные в Numpy ufunc не поддерживаются при работе со структурированными массивами. По крайней мере, некоторые из функций / операторов сравнения (<, > и ==) поддерживаются .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...