我有一个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]])
效果是所选列值重复一次。有什么办法吗?感谢。
答案 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])