什么是jagged / ragged Numpy.array的乘法定义?

时间:2016-11-08 07:03:31

标签: python numpy numpy-broadcasting

我不明白乘以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]]

我想找到数组乘法的定义。

4 个答案:

答案 0 :(得分:3)

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

你应该查找broadcasting,但这不是根本原因。如果数组在操作期间不匹配,通常用于将大小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

答案 1 :(得分:0)

我认为"复制(' a'数组列[x])(' b'数组索引[x])次"。 如果您的目标是进行乘法运算,请改用NP.dot

答案 2 :(得分:0)

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产品 - 同样的事情,但它总结了' * - 之后的值和列表的总和是连接。

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版本可以处理多维数组并使用广播。

答案 3 :(得分:-1)

基本上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]]