在迭代它时填充2D数组

时间:2015-05-20 23:28:52

标签: python numpy matrix multidimensional-array

我想做的一个例子是代替下面显示的内容:

Z_old = [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]
for each_axes in range(len(Z_old)):
    for each_point in range(len(Z_old[each_axes])):
        Z_old[len(Z_old)-1-each_axes][each_point] = arbitrary_function(each_point, each_axes)

我现在想要不用零来初始化Z_old数组,而是在迭代它时用值填充它,这将类似于下面所写的内容,尽管它的语法是非常错误的但是'是我最终想要达到的目标。

 Z = np.zeros((len(x_list), len(y_list))) for Z[len(x_list) -1 - counter_1][counter_2] is equal to power_at_each_point(counter_1, counter_2] for counter_1 in range(len(x_list)) and counter_2 in range(len(y_list))]

2 个答案:

答案 0 :(得分:2)

正如我在对your previous question的回答中所解释的那样,你真的需要对arbitrary_function进行矢量化。

可以通过在函数上调用np.vectorize来实现这一点,如下所示:

Z = np.vectorize(arbitrary_function)(np.arange(3), np.arange(5).reshape(5, 1))

但这只会给你一个小的加速。在您的情况下,由于arbitrary_function正在做大量工作(包括打开和解析Excel电子表格),因此即使注意也不太可能产生足够的差异,更不用说解决您的性能问题了。

使用NumPy加速的全部意义在于找到一次对一个值进行操作的代码的缓慢部分,并将其替换为对整个数组(或至少整个行或列)进行操作的内容立刻。你不能通过查看外部循环来做到这一点,你需要查看里面的循环。换句话说,在arbitrary_function

在您的情况下,您可能想要做的是将Excel电子表格读入一个全局数组,其结构使得您的进程中的每个步骤都可以作为数组范围的操作写入该数组。这是否意味着乘以数组的切片,使用输入值作为索引索引数组,或完全不同的东西,它必须是NumPy可以在C中为您做的事情,或者NumPy不会帮助您。< / p>

如果您无法弄清楚如何做到这一点,您可能需要考虑不使用NumPy,而是使用Cython编译内部循环,或者在PyPy下运行代码。您几乎肯定需要在内循环之外移动“打开并解析整个Excel电子表格”,但至少您不必弄清楚如何根据向量化操作重新思考您的问题,因此它可能对你来说更容易。

答案 1 :(得分:0)

rows = 10
cols = 10
Z = numpy.array([ arbitrary_function(each_point, each_axes) for each_axes in range(cols) for each_point in range(rows) ]).reshape((rows,cols))

可能?