标签:python numpy for-loop list-comprehension
我正在寻找Numpy中的列表理解方法或类似方法来消除for循环的使用,例如. index_values是列表的Python字典列表(每个列表包含不同数量的索引值),s是一个numpy向量:
for i in range(33):
s[index_values[i]] += 4.1
有没有可用的方法可以消除for循环?
解决方法:
我不完全了解index_values是什么类型的对象.但如果它是一个ndarray,或者可以转换为ndarray,你可以这样做:
>>> s = numpy.arange(20)
>>> index_values = (numpy.random.random((3, 3)) * 20).astype('i')
>>> s[index_values] = 4
>>> s
array([ 0, 1, 4, 4, 4, 5, 6, 4, 8, 4, 4, 11, 12,
13, 4, 15, 4, 4, 4, 19])
编辑:但似乎在这种情况下不起作用.根据您的编辑和评论,这是我认为可能适合您的方法.随机列表的长度不同……
>>> index_values = [list(range(x, x + random.randrange(1, 5)))
... for x in [random.randrange(0,50) for y in range(33)]]
…转换成数组并不难:
>>> index_value_array = numpy.fromiter(itertools.chain(*index_values),
dtype='i')
如果您知道数组的长度,请指定计数以获得更好的性能:
>>> index_value_array = numpy.fromiter(itertools.chain(*index_values),
dtype='i', count=83)
由于您的编辑表明您想要类似于直方图的行为,因此简单的索引不会这样做,正如Robert Kern所指出的那样.所以使用numpy.histogram:
>>> hist = numpy.histogram(index_value_array, bins=range(0, 51))
直方图实际上是为浮点直方图构造的.这意味着垃圾箱必须比预期的要大一些,因为最后一个垃圾箱中包含了最后一个值,因此如果我们使用更直观的范围(0,50),则48和49将位于同一个垃圾箱中.结果是一个包含n个计数数组和n 1个bin边界数组的元组:
>>> hist
(array([2, 2, 1, 2, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 5, 5, 5, 3, 3,
3, 3, 3, 2, 1, 0, 2, 3, 3, 1, 0, 2, 3, 2, 2, 2, 3, 2, 1, 1, 2, 2,
2, 0, 0, 0, 1, 0]),
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]))
现在我们可以将计数增加4.1倍并执行向量加法:
>>> s = numpy.arange(50, dtype='f')
>>> hist[0] * 4.1 + s
array([ 8.2, 9.2, 6.1, 11.2, 8.1, 5. , 6. , 7. , 12.1,
13.1, 14.1, 15.1, 16.1, 13. , 18.1, 19.1, 20.1, 37.5,
38.5, 39.5, 32.3, 33.3, 34.3, 35.3, 36.3, 33.2, 30.1,
27. , 36.2, 41.3, 42.3, 35.1, 32. , 41.2, 46.3, 43.2,
44.2, 45.2, 50.3, 47.2, 44.1, 45.1, 50.2, 51.2, 52.2,
45. , 46. , 47. , 52.1, 49. ])
我不知道这是否适合你的目的,但它似乎是一个很好的方法,并且应该以接近c的速度发生,因为它只使用numpy和itertools.
标签:python,numpy,for-loop,list-comprehension 来源: https://codeday.me/bug/20190902/1792187.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。