在Python中以二维数组输入值

时间:2016-11-02 06:40:22

标签: python arrays numpy for-loop

for i in range(limit_1):
    for j in range(limit_2):
        a[i][j]=np.sqrt(np.absolute(b[i])**2+np.absolute(c[j])**2)

是否有其他方法可以使用numpy函数执行此任务?

3 个答案:

答案 0 :(得分:1)

您的原始代码:

limit_1 = 4
limit_2 = 3

import numpy as np
a = np.zeros([limit_1, limit_2])
b = np.array([1, -6, 7, 3])
c = np.array([3, 2, -1])

print("Original:")
for i in range(limit_1):
    for j in range(limit_2):
        a[i][j]=np.sqrt(np.absolute(b[i])**2+np.absolute(c[j])**2)

print(a)

输出:

Original:
[[ 3.16227766  2.23606798  1.41421356]
 [ 6.70820393  6.32455532  6.08276253]
 [ 7.61577311  7.28010989  7.07106781]
 [ 4.24264069  3.60555128  3.16227766]]

缩短版本

print("Improved:")
a = np.sqrt(
        np.tile(np.array([b]).transpose(), (1, limit_2)) ** 2 +\
        np.tile(np.array(c).transpose(), (limit_1, 1)) ** 2)

print(a)

输出:

Improved:
[[ 3.16227766  2.23606798  1.41421356]
 [ 6.70820393  6.32455532  6.08276253]
 [ 7.61577311  7.28010989  7.07106781]
 [ 4.24264069  3.60555128  3.16227766]]

解释

首先,我们将矢量列b拉伸到矩阵(然后取其第二次幂):

>>> np.tile(np.array([b]).transpose(), (1, limit_2))
array([[ 1,  1,  1],
       [-6, -6, -6],
       [ 7,  7,  7],
       [ 3,  3,  3]])

>>> np.tile(np.array([b]).transpose(), (1, limit_2)) ** 2
array([[ 1,  1,  1],
       [36, 36, 36],
       [49, 49, 49],
       [ 9,  9,  9]])

然后我们对行列c执行相同操作:

>>> np.tile(np.array(c).transpose(), (limit_1, 1))
array([[ 3,  2, -1],
       [ 3,  2, -1],
       [ 3,  2, -1],
       [ 3,  2, -1]])
>>> np.tile(np.array(c).transpose(), (limit_1, 1)) ** 2
array([[9, 4, 1],
       [9, 4, 1],
       [9, 4, 1],
       [9, 4, 1]])

然后我们将它们相加并计算根。

P.S。 1 - 我只使用平方功率而不是绝对值,但如果你仍然需要绝对值,你也可以用同样的方法。

P.S。 2 - 请注意,计算可以更高效,即在我们平铺数组之前计算功率,但这种方式对于这个帖子更清晰了)

答案 1 :(得分:0)

请注意,由于n**2abs(n)**2完全相同,因此绝对值没有平方。

使用列表理解:

temp = [math.sqrt(numpy.absolute(x)**2 + numpy.absolute(y)**2) for x in b for y in c]
a = [temp[x:x+limit_2] for x in range(0, len(temp), limit_2)]

答案 2 :(得分:0)

您可以b1D2D扩展到c,然后通过引入新的单例轴作为第二个轴broadcasting,然后执行操作反对np.sqrt(np.abs(b[:,None])**2 + np.abs(c)**2) 。这将简化那里的事情,并实现了矢量化方法,如此 -

non-negative

另外在其他答案中也谈过,由于平方会固有地产生absolute个数字,所以我们可以跳过np.sqrt(b[:,None]**2 + c**2) 操作,给我们 -

char ** magazine;
char ** ransom;
*magazine = malloc(sizeof(char*) * m);
for(int magazine_i = 0; magazine_i < m; magazine_i++){
   magazine[magazine_i] = (char *)malloc(10240 * sizeof(char));
   scanf("%s",magazine[magazine_i]);
}
*ransom = malloc(sizeof(char*) * n);
for(int ransom_i = 0; ransom_i < n; ransom_i++){
   ransom[ransom_i] = (char *)malloc(10240 * sizeof(char));
   scanf("%s",ransom[ransom_i]);
}