Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过公式在python中定义数据数组_Python_Numpy_Multidimensional Array - Fatal编程技术网

通过公式在python中定义数据数组

通过公式在python中定义数据数组,python,numpy,multidimensional-array,Python,Numpy,Multidimensional Array,我有一个多维数组,初始形式为C=np.zero([20,20,20,20])。然后我尝试通过一些公式给C赋值(C(x)=(在本例中为exp(-x)^2)) 这可以用一种更快、可能更像pythonish的方式来完成吗?这里有一种方法 步骤#1获取代码中使用np.array(it.multi#u index)计算的所有索引对应的所有组合。在此基础上,可以利用 步骤#2以矢量化方式对所有组合执行L2范数计算 第3步最后以元素方式执行C(x)=(exp(-x)^2) # Get combinations

我有一个多维数组,初始形式为
C=np.zero([20,20,20,20])
。然后我尝试通过一些公式给C赋值(
C(x)=(在本例中为exp(-x)^2)


这可以用一种更快、可能更像pythonish的方式来完成吗?

这里有一种方法

步骤#1获取代码中使用
np.array(it.multi#u index)
计算的所有索引对应的所有组合。在此基础上,可以利用

步骤#2以矢量化方式对所有组合执行L2范数计算

第3步最后以元素方式执行
C(x)=(exp(-x)^2)

# Get combinations using itertools.product
combs = np.array(list(product(range(N), repeat=4)))

# Perform L2 norm and elementwise exponential calculations to get final o/p 
out = np.exp(-np.sqrt((combs**2).sum(1))**2).reshape(N,N,N,N)
运行时测试并验证输出-

In [42]: def vectorized_app(N):
    ...:     combs = np.array(list(product(range(N), repeat=4)))
    ...:     return np.exp(-np.sqrt((combs**2).sum(1))**2).reshape(N,N,N,N)
    ...: 
    ...: def original_app(N):
    ...:     C=np.zeros([N,N,N,N])
    ...:     it=np.nditer(C, flags=['multi_index'], op_flags=['readwrite'])
    ...:     while not it.finished:
    ...:         diff_n=np.linalg.norm(np.array(it.multi_index))
    ...:         it[0]=np.exp(-diff_n**2)
    ...:         it.iternext()
    ...:     return C
    ...: 

In [43]: N = 10

In [44]: %timeit original_app(N)
1 loops, best of 3: 288 ms per loop

In [45]: %timeit vectorized_app(N)
100 loops, best of 3: 8.63 ms per loop

In [46]: np.allclose(vectorized_app(N),original_app(N))
Out[46]: True

看起来你不想把你的操作应用到每个元素的索引上?这个怎么样:

x = np.exp(-np.linalg.norm(np.indices([20,20,20,20]), axis=0)**2)
np.INDEX是一个非常灵活的函数。对于更复杂的操作,mgrid和meshgrid也是相关的。在本例中,由于有4个维度,它返回一个形状为(4,20,20,20)的数组

纯numpy的速度要快一点:)

结果完全一样:

In [26]: np.all(C == x)
Out[26]: True

非常感谢。我刚刚得到“product()得到了一个意外的关键字参数‘repeat’”,但可能是python的旧版本(?)@PeterFranek你的python版本是什么?2.7.6..(在Ubuntu下)我应该重新安装吗?@PeterFranek好的,我使用的是
2.7.9
。这项功能看起来很旧,就像在中使用的一样。你能试着重新安装吗?我认为这个带有repeat的
产品对你很有用!最后一个问题,你的代码真的至少快了两倍吗?如果可以,我会重新安装:)从您的示例判断,您已经找到了
nditer
教程页面。最后给出了在Cython代码中使用
nditer
的示例。那很快。但在Python代码中,它并不比其他迭代方法快。最好完全避免迭代。
In [13]: timeit posted_code()
1 loops, best of 3: 843 ms per loop

In [14]: timeit np.exp(-np.linalg.norm(np.indices([20,20,20,20]), axis=0)**2)
100 loops, best of 3: 3.76 ms per loop
In [26]: np.all(C == x)
Out[26]: True