Я пытаюсь умножить каждый столбец в 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]
Я искренне удивлен, что это никогда не встречалось в моем собственном коде, но оказалось, что структурированные массивы 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]]
*: Технически кажется, что многие встроенные в ufunc
не поддерживаются при работе со структурированными массивами. По крайней мере, некоторые из функций/операторов сравнения (<
, >
и ==
) поддерживаются.
names
и получите 2d массив с типом dtype.