2011-10-21 64 views
0

的作業任務聽起來像這樣在隨機生成的numpy的陣列創建touples

生成的4 * n個均勻的整數範圍從1 〜6的隨機向量,重塑該向量與四行的陣列n列, 表示n的結果有四個骰子投擲....

我已經想出了以下解決方案:

import numpy as np 

num = 10 
v = np.random.randint(1,7,(num,4)) 

到目前爲止這麼好,但我注意到,我的生成數組在創建時處於4 x n形狀,並沒有被重新塑造。我也考慮過以下內容:

v = np.random.randint(1,7,(4*num)) 
z = np.reshape(v,(num,-4)) 

這兩者之間在v的構建方面有區別嗎?從幾個打印語句看,它們看起來是一樣的(在形狀上),但我無法理解文檔。

回答

1

儘管您的作業任務似乎需要先創建一維數組,然後將其重塑爲2D,但兩種方法都是等價的。

v = np.random.randint(1, 7, (num, 4)) 

NumPy的分配用於num*4整數單個存儲器塊,與從區間[1, 7)均勻地拉伸的隨機值填充它們,然後返回將此解釋1D陣列與num行的「C連續」 2D陣列的陣列和4列*。

v = np.random.randint(1, 7, 4 * num) 
z = np.reshape(v, (num, 4)) 

此做同樣的事情,但更明確:v仍然是一維數組,和zv一個視圖,解釋相同的數據作爲二維數組。這意味着更改v中的值也會在z中更改它,因爲兩個數組都指向相同的內存。

z = np.reshape(v, (num, -4)) 

-4沒有意義 - 數組維數不能爲負數。 NumPy 確實支持一維取特殊值-1,意思是「根據數組的大小自動推斷維度」。它似乎也接受其他負數用於相同的目的,但這是一個無證的功能。這意味着它可能是一個錯誤,並從未來版本中刪除。明確地重塑它(num, 4)或使用(num, -1)讓NumPy的自動發現4

也請注意,您的任務說:「四大行和n列」,而你的陣列將有num行4列。


*)例如,1D陣列[ 1 2 3 4 5 6 7 8 ]被整形到:

 
[ 1 2 3 4 ] 
[ 5 6 7 8 ]