簡體   English   中英

如何使用 numpy ndarray 使用給定數據創建 n 維數組

[英]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)

  1. 如果buffer為 None,則僅使用 shape、dtype 和 order。
  2. 如果buffer是一個暴露緩沖區接口的對象,那么所有的關鍵字都會被解釋。

對於第一個示例,似乎是這樣,即使buffer是整數的np.arrayndarray也將其解釋為不同的類型。 您必須為其提供可選參數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來自其他來源時才需要,這些來源還不是可以ndarrayviewed的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM