【问题标题】:Python 3 numpy uses integer division on matrices and regular division on vectors?Python 3 numpy 对矩阵使用整数除法,对向量使用正则除法?
【发布时间】:2021-03-17 23:58:27
【问题描述】:

运行以下代码时:

from platform import python_version
print(python_version())
    
import numpy as np
x = np.array([[1,2,3],[4,5,6],[7,8,9]])
x[1,:] = x[1,:] / 5
print(x)
y = np.array([1,2,3])
y = y / 5
print(y)

我得到以下输出:

3.8.6
[[1 2 3]
 [0 1 1]
 [7 8 9]]
[0.2 0.4 0.6]

为什么 numpy / python 在用标量除以矩阵中的行时使用整数除法,同时使用常规除法来除单行?我认为 numpy 3 中的“/”划分总是有规律的?

【问题讨论】:

标签: python python-3.x numpy division integer-division


【解决方案1】:

为什么numpy/python在将矩阵中的一行除以标量时使用整数除法

不是 - 您看到的症状是由于分配造成的。

>>> x = np.array([[1,2,3],[4,5,6],[7,8,9]])

除以一个整数会产生一个浮点数组,

>>> z = x[1,:] / 5
>>> z
array([0.8, 1. , 1.2])

但是将该数组分配给 整数数组 的切片会导致 dtype 转换。

>>> x[1,:] = z
>>> x
array([[1, 2, 3],
       [0, 1, 1],
       [7, 8, 9]])
>>> z.dtype
dtype('float64')
>>> x.dtype
dtype('int32')
>>>

这在文档中提到 - Assigning values to indexed arrays

请注意,如果将较高类型分配给较低类型(例如将浮点数分配给整数)甚至是异常(将复数分配给浮点数或整数),则分配可能会导致更改:

【讨论】:

    【解决方案2】:

    这里的诀窍是一致的:

    x[1,:] = x[1,:] / 5
    

    根据dtype的numpy文档:https://numpy.org/doc/stable/reference/generated/numpy.dtype.html

    numpy 数组是同构的,并且包含由 dtype 对象描述的元素

    所以当手动分配行时,它会考虑dtype of x matrix,它的类型是dtype('int64')

    如果您尝试手动将元素分配给y 数组,您也会遇到同样的情况:

    y = np.array([1,2,3])
    y[1] = 0.5
    print(y)
    # this will print array([1, 0, 3])
    

    为什么numpy / python在用标量除以矩阵中的一行时使用整数除法,而使用正则除法来除单行?

    所以它是关于执行np.array 本身的同质dtype 而不是dividing a row in a matrix,如下行所示:

    x[1] / 5
    >>> array([0.8, 1. , 1.2])
    

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      相关资源
      最近更新 更多