如何解决如何解读 numpy 高级索引解决方案
我有一段 我知道有效的 numpy 代码。我知道这一点,因为我已经在我的通用案例中成功测试了它。但是,经过两个小时的反复参考文档和反复试验后,我得出了解决方案。我无法理解我是如何凭直觉知道这样做的。
设置:
a = np.zeros((5,5,3))
目标:设置为 1 轴 1 的索引 0,1,轴 2 的 0,1,所有轴 3 和轴 1 的索引 3,4,轴 2 的 3,4,所有轴 3>
更明确的目标:将第 1 和第 2 行的前两行设置为 1,将第 3 和第 4 行的最后两行设置为 1
结果:
ax1 =np.array([np.array([0,1]),np.array([3,4])])
ax1 =np.array([x[:,np.newaxis] for x in ax1])
ax2 = np.array([[[0,1]],[[3,4]]])
a[ax1,ax2,:] = 1
a
输出:
array([[[1.,1.,1.],[1.,[0.,0.,0.],0.]],[[1.,[[0.,1.]],1.]]])
我倾向于相信我应该能够查看相关矩阵的形状、索引的形状和索引操作,以直观地了解输出。然而,我无法把这个故事放在我的脑海里。比如,它正在改变的子空间的最终形状是什么? 您如何解释这是如何工作的?
形状:
input: (5,3)
ind1: (2,2,1)
ind2: (2,1,2)
final_op: input[ind1,ind2,:]
解决方法
有形状
library(magrittr)
library(dplyr)
library(purrr)
set.seed(1)
labels <- c(rep(1,4),rep(2,4))
x <- sample.int(100,length(labels))
y <- sample.int(100,length(labels))
df <- as.data.frame(list(labels=labels,x=x,y=y))
df2 <- df %>%
group_by(labels) %>%
nest() %>%
summarize(Kmeans = map(data,~kmeans(.x[,c("x","y")],centers = 2))) %>%
mutate(Center = map(Kmeans,"centers"))
df2$Center
# [[1]]
# x y
# 1 53.5 55
# 2 17.5 91
#
# [[2]]
# x y
# 1 28.5 64
# 2 84.5 14
他们ind1: (2,2,1)
ind2: (2,1,2)
一起选择一个(2,2)空间
broadcast
因此,对于第一个维度(块),它选择块 0、1、3 和 4。在第二个维度中,它也选择这些行。
一起是前 2 个块的前 2 行和最后 2 个块的最后 2 行。这就是结果中出现 1 的地方。
一种更简单的创建索引数组的方法:
In [4]: ax1
Out[4]:
array([[[0],[1]],[[3],[4]]])
In [5]: ax2
Out[5]:
array([[[0,1]],[[3,4]]])
这就是广播如何扩展它们:
In [7]: np.array([[0,1],[3,4]])[:,:,None] # (2,2) expanded to (2,1)
In [8]: np.array([[0,None,:] # expand to (2,2)
这可能会使模式更清晰:
In [10]: np.broadcast_arrays(ax1,ax2)
Out[10]:
[array([[[0,0],# block indices
[1,3],[4,4]]]),array([[[0,# row indices
[0,4],4]]])]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。