使用点积

时间:2016-04-03 19:55:17

标签: python python-3.x numpy

我一直试图解决这个问题超过2个小时。

我编写了一个脚本,我在其中放了一些调试print s

...
print(array)
print(m)
print(np.dot(m.ravel(),array.ravel()))
...

当我启动它时,我有这个输出:

$ ./test.py 
[[    0     0     0     0     0     0     0]
 [    0     0     0     0     0     0     0]
 [    0     0     0     0     0     0     0]
 [    0     0     0 20303 20303 20303 20303]
 [20303 20303 20303 20303 20303 20303 20303]
 [20303 20303 20303 20303 20303 20303 20303]
 [20303 20303 20303 20303 20303 20303 20303]]
[[False False False False False False False]
 [False False False False False False False]
 [False False False False False False False]
 [False False False False  True False False]
 [False False  True False  True False False]
 [False False False  True False False False]
 [False False False False False False False]]
15676

当我尝试在python控制台中重现此行为时,我对点积有不同的结果:

$ /usr/bin/python3
Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> array=np.array([[    0,     0,     0,     0,     0,     0,     0],
[    0,     0,     0,     0,     0,     0,     0],
[    0,     0,     0,     0,     0,     0,     0],
[    0,     0,     0, 20303, 20303, 20303, 20303],
[20303, 20303, 20303, 20303, 20303, 20303, 20303],
[20303, 20303, 20303, 20303, 20303, 20303, 20303],
[20303, 20303, 20303, 20303, 20303, 20303, 20303]])
>>> 
>>> m=np.array([[False, False, False, False, False, False, False],
[False, False, False, False, False, False, False],
[False, False, False, False, False, False, False],
[False, False, False, False,  True, False, False],
[False, False,  True, False,  True, False, False],
[False, False, False,  True, False, False, False],
[False, False, False, False, False, False, False]])
>>> np.dot(m.ravel(),array.ravel())
81212

这会导致什么?顺便说一下,81212是我期望的结果,并且真的不明白我的脚本中发生了什么。

2 个答案:

答案 0 :(得分:1)

实际上并非解决问题,但可能是一种解决方法:

在NumPy 1.10中,

np.ravel略有改变,这可能导致“奇怪”的行为:

  

从NumPy 1.10开始,返回的数组将与输入数组具有相同的类型。 (例如,将为掩码数组输入返回一个掩码数组)

但在这种情况下你真的需要np.ravel吗?如何使用boolean indexing并总结结果:

>>> print(array[m].sum())
81212

如果这是你想要实现的目标,那么这种方法可能比np.dot扁平数组更加“pythonic”。

答案 1 :(得分:0)

在我的脚本中,当我在控制台中创建array时,uint16的dtype为int64curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "aaa:bbb"); 。转换它的类型解决了问题,但我不明白为什么它是必要的。