首頁>Program>source

我在這裏已经研究過文件和其他問题,但是看来我 還没有在numpy陣列中进行子設置的麻煩.

我有一个numpy陣列, 為了便於讨論,將其定義如下:

import numpy as np
a = np.arange(100)
a.shape = (10,10)
# array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
#        [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
#        [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
#        [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
#        [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
#        [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
#        [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
#        [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
#        [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
#        [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])

現在我要選擇 a的行和列 由矢量 n1指定 和 n2 .例如:

n1 = range(5)
n2 = range(5)

但是当我使用時:

b = a[n1,n2]
# array([ 0, 11, 22, 33, 44])

然後仅選擇前五个對角線元素,而不選擇整个5x5塊.我發現的解決方案是這樣做的:

b = a[n1,:]
b = b[:,n2]
# array([[ 0,  1,  2,  3,  4],
#        [10, 11, 12, 13, 14],
#        [20, 21, 22, 23, 24],
#        [30, 31, 32, 33, 34],
#        [40, 41, 42, 43, 44]])

但是我敢肯定,只有一个命令應该有一種方法可以完成這个簡單的任務。

最新回復
  • 5月前
    1 #

    您已经获得了很多不錯的示例,以了解如何做自己想要的事情.但是,了解正在發生的事情以及事物按其工作方式運作的原因也很有用.有一些簡單的規則可以在將来為您提供帮助。

    "花式"索引(即使用列表/序列)与"正常"索引(使用切片)之間存在很大差異.根本原因与陣列是否可以"規則地跨步"有關,因此与是否需要複製有關.因此,如果我们希望能够不複製而建立"视圖",則必须區別對待任意序列。

    在您的情况下:

    import numpy as np
    a = np.arange(100).reshape(10,10)
    n1, n2 = np.arange(5), np.arange(5)
    # Not what you want
    b = a[n1, n2]  # array([ 0, 11, 22, 33, 44])
    # What you want, but only for simple sequences
    # Note that no copy of *a* is made!! This is a view.
    b = a[:5, :5]
    # What you want, but probably confusing at first. (Also, makes a copy.)
    # np.meshgrid and np.ix_ are basically equivalent to this.
    b = a[n1[:,None], n2[None,:]]
    

    使用1D序列进行花式索引基本上等同於將它们壓縮在一起並對其結果进行索引.

    print "Fancy Indexing:"
    print a[n1, n2]
    print "Manual indexing:"
    for i, j in zip(n1, n2):
        print a[i, j]
    

    但是,如果要索引的序列与要索引的陣列的維數匹配(在這種情况下為2D),則對索引的處理会有所不同. numpy而不是"將两者壓縮在一起",而是使用像掩碼一樣的索引。

    換句话說, a[[[1, 2, 3]], [[1],[2],[3]]]a[[1, 2, 3], [1, 2, 3]]完全不同 ,因為您要傳遞的序列/陣列是二維的。

    In [4]: a[[[1, 2, 3]], [[1],[2],[3]]]
    Out[4]:
    array([[11, 21, 31],
           [12, 22, 32],
           [13, 23, 33]])
    In [5]: a[[1, 2, 3], [1, 2, 3]]
    Out[5]: array([11, 22, 33])
    

    更精確一點,

    a[[[1, 2, 3]], [[1],[2],[3]]]
    

    的處理方式完全一樣:

    i = [[1, 1, 1],
         [2, 2, 2],
         [3, 3, 3]])
    j = [[1, 2, 3],
         [1, 2, 3],
         [1, 2, 3]]
    a[i, j]
    

    換句话說,輸入是否為行/列向量是索引應如何在索引中重複的簡寫。


    np.meshgridnp.ix_ 將您的1D序列轉換為2D版本以进行索引的簡便方法是

    In [6]: np.ix_([1, 2, 3], [1, 2, 3])
    Out[6]:
    (array([[1],
           [2],
           [3]]), array([[1, 2, 3]]))
    

    類似地( sparse 引數將使其与 ix_相同 上方):

    In [7]: np.meshgrid([1, 2, 3], [1, 2, 3], indexing='ij')
    Out[7]:
    [array([[1, 1, 1],
           [2, 2, 2],
           [3, 3, 3]]),
     array([[1, 2, 3],
           [1, 2, 3],
           [1, 2, 3]])]
    

  • 5月前
    2 #

    構建所需索引的另一種快速方法是使用 np.ix_ 功能:

    >>> a[np.ix_(n1, n2)]
    array([[ 0,  1,  2,  3,  4],
           [10, 11, 12, 13, 14],
           [20, 21, 22, 23, 24],
           [30, 31, 32, 33, 34],
           [40, 41, 42, 43, 44]])
    

    這提供了一種从索引序列構造開放網格的便捷方法。

  • 5月前
    3 #

    您可以使用 np.meshgridn1n2 排列適当的形狀以執行所需的索引編製:

    In [104]: a[np.meshgrid(n1,n2, sparse=True, indexing='ij')]
    Out[104]: 
    array([[ 0,  1,  2,  3,  4],
           [10, 11, 12, 13, 14],
           [20, 21, 22, 23, 24],
           [30, 31, 32, 33, 34],
           [40, 41, 42, 43, 44]])
    

    或者,不帶網格:

    In [117]: a[np.array(n1)[:,np.newaxis], np.array(n2)[np.newaxis,:]]
    Out[117]: 
    array([[ 0,  1,  2,  3,  4],
           [10, 11, 12, 13, 14],
           [20, 21, 22, 23, 24],
           [30, 31, 32, 33, 34],
           [40, 41, 42, 43, 44]])
    

    有一个類似的示例,說明了此整數陣列索引在文件中的工作方式。

    另請參阅《食谱》食谱。挑選行和列。

  • 5月前
    4 #

    看来,您特定問题的用例將涉及圖像處理.如果您正在使用示例来編輯由圖像引起的numpy陣列,則可以使用Python Imaging Library(PIL)。

    # Import Pillow:
    from PIL import Image
    # Load the original image:
    img = Image.open("flowers.jpg")
    # Crop the image
    img2 = img.crop((0, 0, 5, 5))
    

    img2物件是所得裁剪圖像的numpy陣列.

    您可以在此處通過Pillow軟體包(PIL軟體包上的使用者友好派生叉)阅讀有關圖像處理的更多資訊:

  • 可以使用两个具有相同名稱和包的Java類吗?
  • c#:DropdownList資料源