[英]How to create a uniform grid of n-dimensional vectors using numpy (in other words, uniformly fill a n-dimensional hypercube)?
[英]How to create an n-dimensional array using given data using numpy ndarray
我正在嘗試將我的數據轉換為 ndarray。 雖然我得到了我想要的,但是在測試時我無法弄清楚為什么它會給我這個輸出。
我得到輸出:
np.ndarray(shape = (2,1),buffer = np.array([1,2,3,4]))
array([[4.24399158e-314],
[8.48798317e-314]])
但是對於這個塊,我可以按照我想要的方式投射我的隨機數。
def x_mat(n,m):
np.random.seed(0)
randoms = np.random.normal(size=n*m)
print(randoms)
rand_mat = np.ndarray(shape = (n,m),buffer = randoms)
return(rand_mat)
x_mat(5,2)
給:
[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799 -0.97727788
0.95008842 -0.15135721 -0.10321885 0.4105985 ]
array([[ 1.76405235, 0.40015721],
[ 0.97873798, 2.2408932 ],
[ 1.86755799, -0.97727788],
[ 0.95008842, -0.15135721],
[-0.10321885, 0.4105985 ]])
如果有人可以幫助我理解這種行為。 它在第二種情況下做了正確的事情,但我發現第一種情況並不直接。 為什么第一種情況是這樣的?
來自帶有簽名的ndarray
文檔。
ndarray(shape, dtype, buffer, offset, strides, order)
- 如果
buffer
為 None,則僅使用 shape、dtype 和 order。- 如果
buffer
是一個暴露緩沖區接口的對象,那么所有的關鍵字都會被解釋。
對於第一個示例,似乎是這樣,即使buffer
是整數的np.array
, ndarray
也將其解釋為不同的類型。 您必須為其提供可選參數dtype = int
以便 ndarray 明確知道其元素是整數類型。
np.ndarray(shape = (2,1), dtype = int, buffer = np.array([1,2,3,4]))
In [164]: x = np.array([1,2,3,4])
In [165]: x.__array_interface__
Out[165]:
{'data': (40465184, False),
'strides': None,
'descr': [('', '<i8')],
'typestr': '<i8',
'shape': (4,),
'version': 3}
使用ndarray
創建的數組具有相同的data
緩沖區:
In [166]: y = np.ndarray(shape = (2,1),buffer = x)
In [167]: y
Out[167]:
array([[5.e-324],
[1.e-323]])
In [168]: y.__array_interface__
Out[168]:
{'data': (40465184, False), # same as for x
'strides': None,
'descr': [('', '<f8')],
'typestr': '<f8',
'shape': (2, 1),
'version': 3}
對於使用 int dtype 的數組:
In [169]: z = np.ndarray(shape = (2,1),buffer = x, dtype=int)
In [170]: z.__array_interface__
Out[170]:
{'data': (40465184, False),
'strides': None,
'descr': [('', '<i8')],
'typestr': '<i8',
'shape': (2, 1),
'version': 3}
事實上,我們不需要將x
作為緩沖區參數傳遞,只需傳遞其x.data
屬性即可:
In [171]: np.ndarray(shape = (2,1), buffer = x.data, dtype=int)
Out[171]:
array([[1],
[2]])
由於共享數據緩沖區,對z
的修改也出現在x
中 In [172]: z[:] *= 2 In [173]: z Out[173]: array([[2], [4]])輸入 [174]: x 輸出[174]: 數組([2, 4, 3, 4])
和y
:
In [175]: y
Out[175]:
array([[1.e-323],
[2.e-323]])
使用offset
,我們可以創建一個選擇數據緩沖區不同部分的數組:
In [178]: w=np.ndarray(shape = (2,1), buffer = x.data, dtype=int, offset=8)
In [179]: w
Out[179]:
array([[4],
[3]])
但通常我們不使用ndarray
來執行此操作。 相反,我們使用切片來獲取view
,如果需要,可以使用reshape
:
In [181]: x[1:3].reshape(2,1)
Out[181]:
array([[4],
[3]])
您可以使用randoms.reshape(n,m)
或np.random.normal(size=(n,m))
構造等價的rand_mat
。
ndarray
通常僅在buffer
來自其他來源時才需要,這些來源還不是可以ndarray
或viewed
的 ndarray 。
讓我們考慮您的第一個示例:
n = np.ndarray(shape=(2,2), buffer= np.array([1,12,3,4,5,6]), dtype=int, order='F')
#Note that order is 'F' here and the the order changes from above.
print(n)
Output:
[[ 1 3]
[12 4]]
觀察由於提供了緩沖區,現在它進一步研究了形狀、數據類型和順序。 讓我們將順序更改為“c”,看看會發生什么。
n = np.ndarray(shape=(2,2), buffer= np.array([1,12,3,4,5,6]), dtype=int, order='C')
#Note that order is 'C' here.
print(n)
[[ 1 12]
[ 3 4]]
現在,讓我們將緩沖區設為“無”。 然后它只需要 0 和 1 的值並將形狀和 dtype 應用到它。
n = np.ndarray(shape=(2,2), buffer= None, dtype=int, order='F')
print(n)
Output:
[[1 1]
[1 0]]
總而言之,只要有緩沖區,就需要一個數組。 它必須對其應用 dtype、order 和 shape。 當它為無時,緩沖區根本不適用。 希望這可以幫助!:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.