Умножение ndarray на скаляр: TypeError: неверное продвижение типа

1

Я пытаюсь умножить каждый столбец в 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]

  • 2
    Вы должны умножить каждое поле отдельно. Или пропустите параметр names и получите 2d массив с типом dtype.
Теги:
numpy
genfromtxt
structured-array

1 ответ

1

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

  • 0
    Отлично, спасибо за подробный ответ!
  • 0
    На всякий случай, если у кого-то еще есть эта проблема, я использовал genfromtext, чтобы получить имена для каждого столбца, использовал подсказки сверху, чтобы сделать умножение, а затем использовал этот пост, чтобы добавить имена столбцов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню