将ndarray与标量相乘:TypeError:无效的类型提升

时间:2019-01-12 05:01:47

标签: python numpy genfromtxt structured-array

我正在尝试将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 :(得分:1)

老实说,我自己的代码从未出现过这种情况,但事实证明,Numpy结构化数组(即具有字段名的数组)don't support the standard arithmetic operators +-*/(请参阅脚注*)。

因此,您唯一的选择是使用阵列的非结构化版本。 @hpaulj的注释指出了您可以执行此操作的方式(this old answer包含了对如何获得结构化数组的加法运算的彻底探索。)索引单个字段(其结果的行为类似于标准数组),然后将其相乘:

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's。至少某些比较功能/运算符(<>==are supported