按索引克隆列表中的项目

时间:2018-02-24 23:16:40

标签: python arrays numpy

我有一个numpy数组

// This is OK:
    service cloud.firestore {
      match /databases/{database}/documents {
        match /any/{doc} {
            allow read, write: if true;
        }
      }
    }

// Permission denied
    service cloud.firestore {
      match /databases/{database}/documents {
        match /any/{doc} {
            allow read, write: if  request.auth.uid != null;
        }
      }
    }

我希望按索引克隆项目。例如,我的索引为

np.array([[1,4,3,5,2],
          [3,2,5,2,3],
          [5,2,4,2,1]])

这些对应于每行项目的位置。例如第一个[1,4]是第一行中4,2的索引。

我想在最后返回一个新的numpy数组,给出初始数组和索引数组。

np.array([[1,4], 
          [2,4],
          [1,4]])

效果是所选列值重复一次。有什么办法吗?感谢。

2 个答案:

答案 0 :(得分:2)

我评论说这可以被视为一个问题。没有关于它的2d,除了你每行添加2个值,所以最终得到一个2d数组。另一个关键想法是np.repeats让我们多次重复选定的元素。

In [70]: arr =np.array([[1,4,3,5,2],
    ...:           [3,2,5,2,3],
    ...:           [5,2,4,2,1]])
    ...:           
In [71]: idx = np.array([[1,4], 
    ...:           [2,4],
    ...:           [1,4]])
    ...:           

制作一系列'重复'计数 - 从1开头为所有内容,并为我们想要复制的元素添加1:

In [72]: repeats = np.ones_like(arr)
In [73]: repeats
Out[73]: 
array([[1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1]])
In [74]: for i,j in enumerate(idx):
    ...:     repeats[i,j] += 1
    ...:     
In [75]: repeats
Out[75]: 
array([[1, 2, 1, 1, 2],
       [1, 1, 2, 1, 2],
       [1, 2, 1, 1, 2]])

现在只需将repeat应用于展平的数组,然后重新整形:

In [76]: np.repeat(arr.ravel(),repeats.ravel())
Out[76]: array([1, 4, 4, 3, 5, 2, 2, 3, 2, 5, 5, 2, 3, 3, 5, 2, 2, 4, 2, 1, 1])
In [77]: _.reshape(3,-1)
Out[77]: 
array([[1, 4, 4, 3, 5, 2, 2],
       [3, 2, 5, 5, 2, 3, 3],
       [5, 2, 2, 4, 2, 1, 1]])

我可以添加一个列表解决方案,一旦我解决了这个问题。

逐行np.insert解决方案(充实@ f5r5e5d建议的概念):

用一行测试:

In [81]: row=arr[0]
In [82]: i=idx[0]
In [83]: np.insert(row,i,row[i])
Out[83]: array([1, 4, 4, 3, 5, 2, 2])

现在迭代地应用于所有行。然后可以将数组列表转换回数组:

In [84]: [np.insert(row,i,row[i]) for i,row in zip(idx,arr)]
Out[84]: 
[array([1, 4, 4, 3, 5, 2, 2]),
 array([3, 2, 5, 5, 2, 3, 3]),
 array([5, 2, 2, 4, 2, 1, 1])]

答案 1 :(得分:1)

np.insert可能有帮助

a = np.array([[1,4,3,5,2],
          [3,2,5,2,3],
          [5,2,4,2,1]])

i = np.array([[1,4], 
          [2,4],
          [1,4]])


np.insert(a[0], 4, a[0,4])

Out[177]: array([1, 4, 3, 5, 2, 2])

如上所述,np.insert一次可以从一维obj中执行多个元素

np.insert(a[0], i[0], a[0,i[0]])

Out[187]: array([1, 4, 4, 3, 5, 2, 2])