[英]Understanding the double star notation in Python in an algorithm
我對 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)
的含義?
** 將明智地執行電源操作元素。 這是一些示例代碼,可以清楚地說明:
>>> 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)
請注意,output 數組的維度為 (6,3)。 6 是a
的第一個維度,3 是b
的第一個維度。 當存在維度不匹配時,運算符將a
的每個元素提升到b
的每個元素的冪。
您的測試示例不起作用的原因是因為一些細節。 在您的第二個代碼塊(測試運算符的代碼)中,您的形狀為(6,)
而不是 ( u
(6,1)
。 (6,)
可能由於 numpy arrays 和 python ** 運算符之間的小不兼容而不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.