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

Python 将ndarray与标量相乘:TypeError:无效的类型升级,python,numpy,genfromtxt,structured-array,Python,Numpy,Genfromtxt,Structured Array,我试着用一个标量乘以n数组中的每一列。当我尝试执行此操作时,会出现错误TypeError:invalid type promotion 我尝试过使用array.astype(float),但这会给出所有NaNs array = np.genfromtxt("file.csv", dtype=float, delimiter='\t', names=True) newarray = array*4.0 file.csv有许多列标题。例如: array['col_a'] = [5.0, 6.0]

我试着用一个标量乘以n数组中的每一列。当我尝试执行此操作时,会出现错误
TypeError:invalid type promotion

我尝试过使用
array.astype(float)
,但这会给出所有
NaN
s

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['colu a']
将成为
[20.0,24.0]
我真的很惊讶,我自己的代码中从未出现过这种情况,但事实证明Numpy结构化数组(即具有字段名的数组)
+
-
*
//code>(见脚注*)

因此,您唯一的选择是使用阵列的非结构化版本@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
返回标准数组而不是结构化数组):


*:从技术上讲,在使用结构化阵列时,似乎不支持Numpy的许多内置功能。至少有一些比较函数/运算符(
,和
==
)。

必须分别乘以每个字段。或者省略
names
参数并获得一个二维数组的dtype float。为了防止其他任何人有这个问题,我使用genfromtext来获得每列的名称,使用上面的提示进行乘法,然后使用genfromtext来加回列名。
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]]