【问题标题】:Understanding the double star notation in Python in an algorithm在算法中理解 Python 中的双星符号
【发布时间】:2020-06-21 18:01:27
【问题描述】:

我对 Python 中的以下代码感到困惑:

import numpy as np
from numpy.random import rand, randn

def generate_data (beta, n):
       u= np.random.rand(n,1)
       y= (u**np.arange(0,4))@beta
       return y
    
np.random.seed(12)
beta = np.array([[10,-140,400,-250]]).T
n = 5 
y = generate_data(beta, n)
print(y)

我真的不明白的意思 u**np.arange(0,4),尤其是因为 u 是一个维度为 n 乘以 1 的向量(其中 n 是任意的),而np.arange(0,4) 是一个维度为 1 乘以 4 的向量。尽管如此,这个算法有效

因此我尝试了以下方法:

import numpy as np

u= np.array([1,2,3,4,5,6]).T
beta = np.array([[10,-140,400,-250]]).T
y = (u ** np.arange(0,4)) @ beta

print (y)

这次n 设置为 6。但是,此算法不起作用,并且有关于尺寸的错误消息。

谁能告诉我神秘的u ** np.arange(0,4)是什么意思?

【问题讨论】:

  • 在这种情况下,** 意味着权力。在许多其他语言中,它将是 ^
  • @Klaus D. 谢谢。但是我们如何将数组的力量带到数组中呢?为什么第一个算法有效,而第二个无效?
  • 当 (n,1) 数组与 (m) 数组一起使用时,结果为 (n,m)。加法、乘法和这种幂都是如此。我建议花一些时间阅读 numpy quickstart,关注 broadcasting

标签: python python-3.x numpy


【解决方案1】:

** 将明智地执行电源操作元素。这是一些示例代码,可以清楚地说明:

>>> a = np.array([2,3,4])
>>> b = np.array([1,2,3])
>>> a**b
array([ 2,  9, 64], dtype=int32)

如您所见,a 的第 0 个元素乘以 b 的第 0 个元素的幂,a 的第 1 个元素乘以 b 的第 1 个元素的幂,依此类推。

编辑:

我的原始答案没有解决您的部分问题。这是一个示例,说明为什么它可以使用任意 n 值。

a 是一个维度为(6,1) 的numpy 数组。

>>> a = np.array([[1], [2], [3], [4], [5], [6]])
>>> a.shape
(6, 1)
>>> b = np.array([1,2,3])
>>> a**b
array([[  1,   1,   1],
       [  2,   4,   8],
       [  3,   9,  27],
       [  4,  16,  64],
       [  5,  25, 125],
       [  6,  36, 216]], dtype=int32)

请注意,输出数组的维度为 (6,3)。 6是a的第一个维度,3是b的第一个维度。当存在维度不匹配时,运算符将a 的每个元素提升到每个元素的幂到b

您的测试示例不起作用的原因是一些细节。在您的第二个代码块(测试运算符的代码)中,u 的形状为 (6,) 而不是 (6,1)(6,) 可能由于 numpy 数组和 python ** 运算符之间的小不兼容而无法工作。

【讨论】:

  • 谢谢。但是为什么第一个算法有效呢? n 可以设置为任意数字,例如示例中的 5。这显然与另一个数组的维度不匹配...
  • 我错过了问题的那一部分,我编辑了我的答案来解释这一点
猜你喜欢
  • 1970-01-01
  • 2014-05-27
  • 2011-02-24
  • 2016-01-21
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
相关资源
最近更新 更多