[英]TypeError: can't multiply sequence by non-int of type 'numpy.float64' - multiply column by value
[英]How can I multiply column of the int numpy array to the float digit and stays in int?
我有一个numpy数组:
>>> b
array([[ 2, 2],
[ 6, 4],
[10, 6]])
我想将第一列乘以浮点数,结果我需要int数,因为当我这样做时:
>>> b[:,0] *= 2.1
它说:
TypeError: Cannot cast ufunc multiply output from dtype('float64') to dtype('int64') with casting rule 'same_kind'
我需要看起来像这样的数组:
array([[ 4, 2],
[12, 4],
[21, 6]])
@Umang Gupta解决了你的问题。 我很好奇为什么这个有用,所以我发布了我发现的附加上下文。 FWIW这个问题已经在这里被问到并回答了 ,但是这个答案也没有像我希望的那样真正地了解正在发生的事情,所以这是我的尝试:
使用*=
运算符调用__imul__()
特殊方法来进行Numpy ndarrays的就地乘法,后者又调用通用函数(ufunc) multiply()
。
multiply()
中有两个与此相关的参数: out
和casting
。
out
参数指定输出(及其类型)。 在就地乘法运算符中, out
设置为self
,即调用乘法运算的ndarray
对象。 特别是, *=
的确切调用如下所示:
ufunc(self, other, out=(self,))
^其中ufunc = multiply
, self = b
( ndarray
,类型int64
, other = 2.1
(标量,类型float
)
但是, casting
参数确定了由于操作而允许哪种数据类型转换的规则。 作为numpy的1.10 ,作为默认值casting
被same_kind
, 这意味着 :
只允许使用float64到float32之类的安全转换或类型转换
由于我们的ufunc
调用没有指定的值casting
参数,默认( same_kind
)使用-但因为我们已经指定这会导致问题out
为具有int64
D型细胞,这是不一样的那种作为INT输出-by-float乘法。 使用same_kind
转换时,操作的float
结果无法转换为int
。 这就是我们看到这个错误的原因。
我们可以使用multiply()
显式复制此错误:
np.multiply(b, 2.1, out=b)
TypeError: Cannot cast ufunc multiply output from dtype('float64') to dtype('int64') with casting rule 'same_kind'
通过将参数值设置为"unsafe"
,可以放宽multiply()
的casting
要求。 然后,当out
也被设置时,输出被强制为out
类型,无论它是否是同一种类型(如果可能):
np.multiply(b, 2.1, out=b, casting="unsafe")
# specifying int output and allowing casting to be "unsafe" allows re-conversion to int
array([[ 4, 4],
[12, 8],
[21, 12]])
另一方面,使用常规赋值运算符更新b[:,0]
是可以的。 这就是@Umang Gupta的解决方案。
附:
b[:,0] = b[:,0]* 2.1
*
调用multiply
ufunc,就像调用*=
。 但由于它没有调用操作的inplace版本,因此没有指定out
参数,因此输出没有set类型。 然后,标准类型转换允许整数向上浮动:
np.multiply(b, 2.1)
# float output
array([[ 4.2, 4.2],
[ 12.6, 8.4],
[ 21. , 12.6]])
然后,正常赋值运算符=
获取乘法的输出并将其存储在b[:,0]
。 根据Numpy文档为索引数组赋值:
请注意,如果将较高类型分配给较低类型(如浮点数到整数),则分配可能会导致更改
所以问题在于*=
运算符自动设置out
参数而不将casting
参数从same_kind
为unsafe
。 (并不是说这是一个错误,只是因为这就是你得到错误的原因。)并且通过利用Numpy中赋值的自动“向下转换”属性,接受的解决方案可以解决这个问题。 希望有所帮助! (另外,Numpy专业人士,请随时纠正我的任何误解。)
虽然b[:,0] *= 2.1
可能不起作用,但b[:,0] = b[:,0]* 2.1
有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.