python - 将 ndarray 与标量相乘:TypeError:无效的类型提升
问题描述
我试图将 ndarray 中的每一列乘以一个标量。当我尝试这样做时,我得到了错误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['col_a']
:[20.0, 24.0]
解决方案
老实说,我很惊讶这从未出现在我自己的代码中,但事实证明 Numpy 结构化数组(即具有字段名称的数组)不支持标准算术运算符 +
, -
, *
, or /
(见脚注*)。
因此,您唯一的选择是使用阵列的非结构化版本。@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]]
*:从技术上讲,在使用结构化数组时,似乎不支持许多 Numpy 的内置ufunc
's 。至少支持<
一些比较函数/运算符( 、>
和==
)。
推荐阅读
- javascript - CKeditor5 实例中的变量到 textarea
- python - 机器学习中的测试和训练数据
- python - Python 和 matplotlib - 制作混沌游戏时出错
- google-app-engine - Google App Engine 模块化项目结构
- c# - 下面提到的 Admob Ads 初始化方法的区别?
- clojure - Clojure 中的点破折号与点前缀
- matlab - 自动排序文件的代码创建临时文件而不是文件夹
- python - 如何自定义Django表单的提交和验证方式?
- android-gradle-plugin - 在任务上找不到参数 [] 的方法 getAaptOptions()
- umbraco - 如何在 Umbraco8 中归档旧节点