【问题标题】:Entering values in a 2-D array in Python在 Python 中输入二维数组中的值
【发布时间】:2017-03-15 09:43:22
【问题描述】:
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 函数?

【问题讨论】:

  • 你能展示一下预期数组的外观吗?
  • @RomanPerekhrest : 数组应该是 2x2 数组,元素 a[i][j] 由 for 循环中的表达式给出

标签: python arrays numpy for-loop


【解决方案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]])

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


附: 1 - 我只使用平方幂而不是绝对值,但如果你仍然需要绝对值,你可以用同样的方式。

附: 2 - 请注意,计算可以更有效地完成,即在我们平铺阵列之前计算功率,但这种方式对于这篇文章来说更清晰)

【讨论】:

    【解决方案2】:

    请注意,没有必要对绝对值进行平方,因为 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)]
    

    【讨论】:

    • 我这里的数组元素也可以很复杂
    • @PrishChakraborty 不管怎样,这个解决方案应该可以工作
    【解决方案3】:

    您可以通过将b1D 扩展到2D 来使用broadcasting,方法是引入一个新的单轴作为带有np.newaxis/None 的第二轴,然后对c 执行操作。这将简化那里的事情并实现矢量化方法,就像这样 -

    np.sqrt(np.abs(b[:,None])**2 + np.abs(c)**2)
    

    正如在其他答案中所讨论的那样,由于平方本身会产生 non-negative 数字,所以我们可以跳过 absolute 操作,给我们 -

    np.sqrt(b[:,None]**2 + c**2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-24
      • 2019-04-05
      • 1970-01-01
      • 2021-11-02
      • 2021-12-31
      • 2016-02-24
      • 1970-01-01
      • 2015-10-15
      相关资源
      最近更新 更多