簡體   English   中英

按行填充 Numpy Array

[英]Fill Numpy Array row wise

我正在試驗 Numpy 功能,想知道是否有辦法實現所解釋的所需行為。 給定一個 numpy 數組,如下所示

array = np.array([[1,3,3],[6,7,6],[9,9,4]])
print(array)

print(array)輸出print(array)

[[1 3 3]
 [6 7 6]
 [9 9 4]]

我得到了每一行的最大值

max_array =  array.max(axis=1,keepdims=1)
print(max_array)

print(max_array)輸出print(max_array)

[[3]
 [7]
 [9]]

我使用下面的代碼在數組中的所有最大元素上應用掩碼

masked_array = np.ma.masked_equal(array,max_array)
print(masked_array)

打印輸出(masked_array)

[[1 -- --]
 [6 -- 6]
 [-- -- 4]]

現在我已經屏蔽了數組,我想對數組中的非最大元素執行操作,例如乘以 3,如下面的代碼所示

 mul_array= np.multiply(masked_array,3)
 print(mul_array)

print(mul_array)輸出print(mul_array)

[[3 -- --]
 [18 -- 18]
 [-- -- 12]]

我想在 mul_array 中的相同位置插入先前被屏蔽的 max_array 中的最大元素,但我找不到任何東西來實現所需的行為。 以下是我的預期矩陣。 我想問一下是否有任何 Numpy 操作來實現所需的行為

期望輸出

[[3 3 3]
 [18 7 18]
 [9 9 12]]

感謝您的幫助!

import numpy as np
a = np.array([[1,3,3],[6,7,6],[9,9,4]])

首先找到你的最大值

max_array =  a.max(axis=1,keepdims=True)

In [19]: max_array
Out[19]: 
array([[3],
       [7],
       [9]])

然后為所有不是的值創建一個布爾數組

mask = (a != max_array)

In [20]: mask
Out[20]: 
array([[ True, False, False],
       [ True, False,  True],
       [False, False,  True]], dtype=bool)

然后使用掩碼過濾左側的賦值和右側的操作。

a[mask] = a[mask] * 3

In [21]: a
Out[21]: 
array([[ 3,  3,  3],
       [18,  7, 18],
       [ 9,  9, 12]])

Numpy 索引


與掩碼數組相同的過程

b = np.array([[1,3,3],[6,7,6],[9,9,4]])
b_max =  b.max(axis=1,keepdims=True)
b_ma = np.ma.masked_equal(b,b_max)
q = b_ma * 3
b = q.data

# or
b_ma *= 3
b = b_ma.data

這些將導致b成為b_ma數據的b_ma

In [80]: b.flags['OWNDATA']
Out[80]: False

如果你不想要一個視圖 -

In [81]: b = b_ma.data.copy()

In [82]: b.flags['OWNDATA']
Out[82]: True

一種選擇是使用np.nan而不是--B的扁平版本:

A = np.array([[1, 2, np.nan], [4, np.nan, 6], [7, 8, np.nan]])
B = np.array([[3], [5], [9]])
B = B.flatten()

所以B現在的形式是[3, 5, 9] 然后您可以使用這些np.nan識別單元格的位置並重新分配它們:

x, y = np.nonzero(np.isnan(A))
A[x,y] = B

輸出:

>>> A
array([[1., 2., 3.],
       [4., 5., 6.],
       [7., 8., 9.]])

注意:

  • A類型是float因為在此之前使用了np.nan
  • 變化np.nonzero是替代np.where在1D情況
  • 您可能更喜歡使用np.copy(A)來避免A動態變化。

首先,我更改了語法,以便所有數組和值都匹配 numpy 語法。 然后創建一個數組“索引”來存儲索引,其中 A 數組具有空值。 創建一個 C 數組,它是 A 的副本,並使用 np.take 函數用 B 值填充空值。

import numpy as np
A = np.array([ [1, 2, np.nan],
      [4, np.nan, 6],
      [7, 8, np.nan] ])
B = np.array([ [3],
      [5],
      [9] ,
     ])

indexes = np.where(np.isnan(A))

C = np.copy(A)

C[indexes] = np.take(B, indexes[0])

print(C)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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