繁体   English   中英

如何将int numpy数组的列乘以float数字并保持int?

[英]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()中有两个与此相关的参数: outcasting

out参数指定输出(及其类型)。 在就地乘法运算符中, out设置为self ,即调用乘法运算的ndarray对象。 特别是, *= 的确切调用如下所示:

ufunc(self, other, out=(self,))

^其中ufunc = multiplyself = bndarray ,类型int64other = 2.1 (标量,类型float

但是, casting参数确定了由于操作而允许哪种数据类型转换的规则。 作为numpy的1.10 ,作为默认值castingsame_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_kindunsafe (并不是说这是一个错误,只是因为这就是你得到错误的原因。)并且通过利用Numpy中赋值的自动“向下转换”属性,接受的解决方案可以解决这个问题。 希望有所帮助! (另外,Numpy专业人士,请随时纠正我的任何误解。)

虽然b[:,0] *= 2.1可能不起作用,但b[:,0] = b[:,0]* 2.1有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM