锯齿/粗糙Numpy.array的乘法定义是什么?



我不明白Numpy.arrays相乘时会发生什么。

例如,使用锯齿(或粗糙)数组

import numpy as np
a = np.array([[1,2,3],[100,200]])
b = np.array([2, 4])
print(a * b)

[[1, 2, 3, 1, 2, 3] [100, 200, 100, 200, 100, 200, 100, 200]]

但是,如果我稍微修改一下

import numpy as np
a = np.array([[1,2],[100,200]])
b = np.array([2, 4])
print(a * b)

[[  2   8]
[200 800]]

我想找到数组乘法的定义

你的主要问题是你的数组a不是一个"正常"的数组,因为第二个维度是不相等的。如果你尝试a.shape,你得到(2,), a.dtype给出dtype('O')(意思是对象),a[0].dtype导致属性错误'list' object has no attribute 'dtype'。这意味着您有一个维度为2的numpy数组,每个数组包含一个python列表。

你应该查一下广播,但这不是根本原因。如果在操作期间数组不匹配,通常打算将大小为1的维度扩展为更大的值。还有很多要做的,但是文档很清楚。对于您的特定问题,广播意味着如果两个数组的维度匹配或其中一个数组为1(从后到前计数,用1填充空值),numpy不会抛出错误。

你有两个(2,)数组(a包含2个列表,b包含2个整数),这意味着维度匹配(不需要广播)。

这个"错误行为"的其余部分(它不是)与numpy无关,因为在标准python中(它起作用是因为a包含python列表)用标量乘以列表会经常重复和追加列表。

>>>[1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

,同样的事情发生在您的情况下:a中的第一个列表乘以2,第二个列表乘以4

我认为它"复制('a'数组列[x]) ('b'数组索引[x])次"。如果你的目标是做乘法,使用NP。点而不是

np.tensordot文档中的示例可能会有所帮助。它创建一个字符串对象数组,并显示dot产生字符串复制。

对于字符串和列表,*表示复制

In [134]: 'abc'*3
Out[134]: 'abcabcabc'

你的数组:

In [126]: a
Out[126]: array([[1, 2, 3], [100, 200]], dtype=object)
In [127]: b
Out[127]: array([2, 4])

和字符串数组(我也可以做a[:]=['a','B'])

In [128]: c = np.array(['a','B'],dtype=object)
In [129]: c
Out[129]: array(['a', 'B'], dtype=object)

元素乘法-复制a的元素2次和3次。

In [130]: a*b
Out[130]: array([[1, 2, 3, 1, 2, 3], [100, 200, 100, 200, 100, 200, 100, 200]], dtype=object)

dot product -同样的东西,但它"求和"* -之后的值和sum for list是串联。

In [131]: a.dot(b)
Out[131]: [1, 2, 3, 1, 2, 3, 100, 200, 100, 200, 100, 200, 100, 200]

同样的事情发生在字符数组、复制和连接上。

In [132]: c*b
Out[132]: array(['aa', 'BBBB'], dtype=object)
In [133]: c.dot(b)
Out[133]: 'aaBBBB'

当处理对象dtype数组时,numpy本质上是遍历元素并应用该对象类定义的操作符/方法。

a*b生效

In [147]: [i*j for i,j in zip(a,b)]
Out[147]: [[1, 2, 3, 1, 2, 3], [100, 200, 100, 200, 100, 200, 100, 200]]

numpy版本稍微花哨一点,可以处理多维数组并使用广播。

基本上numpy数组a*b返回初等乘法,乘法应该是这样的。

Eg-1

import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print(a * b)
输出:

[[ 5 12] [21 32]]

Eg-2

import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([5,6])
print(a * b)
输出:

[[ 5 12] [15 24]]

相关内容

  • 没有找到相关文章

最新更新