2012-07-19 72 views
1

低和看,我升级到1.5.1后遇到numpy.choose回归。据我所知,过去的版本(和数字)支持一个无限数量的潜在选择。 “新”选择限于32. Here is a post其中一位用户对回归感到悲叹。numpy.choose 32选择限制

我有一个包含100个选项(0-99)的列表,用于修改数组。作为解决方法,我使用下面的代码。可以理解的是,它比使用选择慢7倍。我不是C程序员,虽然我想解决这个问题,但我想知道还有其他可能更快的解决方法。思考?

d={...} #A dictionary with my keys and their new mappings 
for key, value in d.iteritems(): 
    array[array==key]=value 
+0

我是否正确理解'd'的键是数字0到99? – 2012-07-19 22:22:28

+0

是的。 d是数字。 – Jzl5325 2012-07-19 22:30:55

回答

1

我推测,d有钥匙099。在这种情况下,解决方案非常简单。首先,将d的值写入NumPy数组values,方法d[i] == values[i] - 无论如何,这似乎是这些值的自然数据结构。然后,你可以通过

values[array] 

如果要修改array到位,简单地做

array[:] = values[array] 
+0

什么是数组[:]功能称为?我想更详细地了解numpy文档中发生的情况。 – Jzl5325 2012-07-19 23:49:13

+0

@ Jzl5325:这是切片整个阵列。它实际上不是NumPy特有的,而是一般的Python。检查官方的Python教程,它解释了切片的工作原理。 – 2012-07-19 23:53:36

+0

Gotcha。我之前没有使用[:],但可以看到很多用途。 =语法是抛出我的东西(尽管它工作得很好)。我们不是分配变量,而是通过=来运行if语句。它读取“如果输入数组中的值等于values数组中的索引,则用数值编号替换输入数组编号”?谢谢! – Jzl5325 2012-07-20 03:08:45

0

我不知道高效地访问与替换值新的阵列,它不是就地(NB:我不经常使用numpy - 所以有点生锈):

import numpy as np 

d = {0: 5, 1: 3, 2: 20} 
data = np.array([[1, 0, 2], [2, 1, 1], [1, 0, 1]]) 
new_data = np.array([d.get(i, i) for i in data.flat]).reshape(data.shape) # adapt for list/other 
+0

NumPy的全部意义在于避免Python循环转而使用C语言实现的隐式循环。这个代码迭代了单一值,所以它肯定不是很快。 – 2012-07-19 23:33:13

+0

@SvenMarnach我知道numpy是如何工作的。 '.flat'是低层次的,从列表中产生的数组是低层次的,重新构造并不复杂,因此,作为一个kludge,它可能并不是最差的。在33种选择中,它也可以无限加快:) – 2012-07-19 23:38:24

+0

如果数组巨大,即使有33种选择,它也可能比原始代码慢。 – 2012-07-19 23:50:42