【问题标题】:Multiplying ndarray with scalar: TypeError: invalid type promotion将 ndarray 与标量相乘:TypeError:无效的类型提升
【发布时间】:2019-01-12 05:01:46
【问题描述】:

我试图将 ndarray 中的每一列都乘以一个标量。当我尝试这样做时,我收到错误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]

乘以标量后,我想要: newarray['col_a'] 成为[20.0, 24.0]

【问题讨论】:

  • 您必须分别将每个字段相乘。或者省略names参数,得到一个dtype float的二维数组。

标签: python numpy genfromtxt structured-array


【解决方案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

【讨论】:

  • 以防万一其他人有这个问题,我使用 genfromtext 获取每列的名称,使用上面的提示进行乘法,然后使用 this post 加回列名.
猜你喜欢
  • 1970-01-01
  • 2021-06-29
  • 2021-04-11
  • 2020-05-19
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多