微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何解读 numpy 高级索引解决方案

如何解决如何解读 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 举报,一经查实,本站将立刻删除。