花哨索引numpy矩阵:每行一个元素

时间:2016-08-24 19:03:17

标签: python arrays numpy matrix scientific-computing

我有一个2d numpy数组,矩阵,形状(m,n)。我的实际用例有m~1e5和n~100,但是为了有一个简单的最小例子:

matrix = np.arange(5*3).reshape((5, 3))

我有一个整数的索引数组,idx,形状(m,),每个条目都在[0,n)之间。此数组指定应从矩阵的每一行中选择哪一列。

idx = np.array([2, 0, 2, 1, 1])

所以,我试图从第0行选择第2列,第1行第0列,第2行第2列,第1行第1列,第4行第1列。因此最终答案应该是:

correct_result = np.array((2, 3, 8, 10, 13))

我尝试了以下内容,这是直观的,但不正确:

incorrect_result = matrix[:, idx]

上面的语法是将idx作为一个花哨的索引数组逐行应用,导致另一个形状矩阵(m,n),这不是我想要的。

这种类型的花式索引的正确语法是什么?

1 个答案:

答案 0 :(得分:4)

/* Navigation */
.owl-prev, .owl-next {
  position:absolute;
  top:50%;
  padding:5px;
  margin:0;
  z-index:100;
  font-size:3rem;
  cursor:pointer;
  color:#000000; 
}

.owl-prev {
  left:-10px;
  opacity: 0 !important;
}

.owl-next {
  right:-10px;
  opacity: 0 !important;
}

.owl-theme .owl-controls .owl-buttons div{
  color: #555;
  display: inline-block;
  zoom: 1;
  *display: inline;/*IE7 life-saver */
  font-size: 3rem;
  -webkit-border-radius: 0px;
  -moz-border-radius: 0px;
  border-radius: 0px;
  background: transparent;
  filter: Alpha(Opacity=100);/*IE7 fix*/
  opacity: 1;
  margin-top:-32px;
}

.owl-theme .owl-controls .owl-buttons div:hover {
  color:#000000;
  opacity: 1 !important;
}

高级索引表达式correct_result = matrix[np.arange(m), idx] 提供的输出为matrix[I, J]

如果我们需要output[n] == matrix[I[n], J[n]],那么我们需要output[n] == matrix[n, idx[n]]I[n] == n,因此我们需要J[n] == idx[n]Inp.arange(m) J