Jes*_*ose 8 python numpy matrix
我想计算一个大的(1,000,000 x 3,000)布尔numpy数组的索引权重和.大型布尔数组不经常更改,但权重来自查询时,我需要非常快速地回答,而不需要复制整个大型数组,或者将小权重数组扩展到大型数组的大小.
结果应该是一个包含1,000,000个条目的数组,每个条目都具有与该行的True值对应的权重数组条目的总和.
我研究了使用蒙面数组,但它们似乎需要构建一个与我的大型布尔数组大小相当的权重数组.
下面的代码给出了正确的结果,但在乘法步骤中我买不起该副本.乘法甚至不是必需的,因为values数组是布尔值,但至少它正确处理广播.
我是新手,喜欢它,但我会为这个特殊问题放弃它.我已经学会了足够多的知识,以远离任何循环python.
我的下一步是在C中编写这个例程(顺便说一句,这有一个额外的好处,就是让我通过使用位而不是字节来节省内存.)
除非你们中的一个笨拙的大师能把我从cython中救出来吗?
from numpy import array, multiply, sum
# Construct an example values array, alternating True and False.
# This represents four records of three attributes each:
# array([[False, True, False],
# [ True, False, True],
# [False, True, False],
# [ True, False, True]], dtype=bool)
values = array([(x % 2) for x in range(12)], dtype=bool).reshape((4,3))
# Construct example weights, one for each attribute:
# array([1, 2, 3])
weights = array(range(1, 4))
# Create expensive NEW array with the weights for the True attributes.
# Broadcast the weights array into the values array.
# array([[0, 2, 0],
# [1, 0, 3],
# [0, 2, 0],
# [1, 0, 3]])
weighted = multiply(values, weights)
# Add up the weights:
# array([2, 4, 2, 4])
answers = sum(weighted, axis=1)
print answers
# Rejected masked_array solution is too expensive (and oddly inverts
# the results):
masked = numpy.ma.array([[1,2,3]] * 4, mask=values)
Run Code Online (Sandbox Code Playgroud)
点积(或内积)就是您想要的。它允许您采用大小矩阵m\xc3\x97n和长度向量n并将它们相乘,产生长度向量m,其中每个条目是矩阵的一行与作为权重的向量条目的加权和。
Numpy 将其实现为array1.dot(array2)(或numpy.dot(array1, array2)在旧版本中)。例如:
from numpy import array\n\nvalues = array([(x % 2) for x in range(12)], dtype=bool).reshape((4,3))\n\nweights = array(range(1, 4))\n\nanswers = values.dot(weights)\nprint answers\n# output: [ 2 4 2 4 ]\nRun Code Online (Sandbox Code Playgroud)\n\n(不过,您应该使用timeit模块来对此进行基准测试。)
| 归档时间: |
|
| 查看次数: |
1511 次 |
| 最近记录: |