【问题标题】:Julia- extract part of multidimensional matrix by vectorJulia-通过向量提取多维矩阵的一部分
【发布时间】:2016-07-26 15:14:07
【问题描述】:

我正在尝试用向量减少多维矩阵。

假设矩阵 A 为 1000 x 10 x 100。 向量 b 可以是 100 x 1,其中 100 个条目是 A 的第一个维度的一部分。A 的第一个维度的切片中总是有一个元素与 b 的每个元素匹配。

如何将矩阵简化为匹配向量?

我试过了

Ared= A[b,:,:]

但它不起作用。

此示例中的新矩阵应具有 100 x 10 x 100 的形式

有人有什么想法吗?

【问题讨论】:

  • 在 A 的第一个维度中总是有一个元素与 b 的每个元素匹配。我不完全理解你的第二个问题。一般来说,我想创建一个与原始矩阵具有相同形状的新矩阵,但第一维被缩减为向量 b。
  • 你的问题是模棱两可的,并且得到了两个相互矛盾但可能有效的答案,这取决于你真正想要的是什么;你能具体说明你想要什么吗?例如,如果“A”是A = reshape(0.1:0.1:2.4, 3,4,2),b 是一个二元向量,你能举一个b 和预期输出的例子吗? b 是要用于选择 A 子范围的行索引向量吗? (例如b = [1;3])或者您是说“b 可以从A(1,:,:)(例如b = [0.4; 1.9])中的可用值中获取任意两个值?请澄清。
  • 如果是前者,那就用我的回答。如果是后者,请使用迈克尔的答案。如果两者都不是,请用适当的例子重新表述并澄清您的问题。
  • 第一个答案解决了我的问题,但第二个答案在一般情况下也很有帮助。非常感谢您的帮助。
  • 很高兴您对它进行了排序。请将您认为正确的答案标记为已接受,以供将来的观众使用。 (我还是不确定你指的是哪一个,哈哈)

标签: arrays matrix julia


【解决方案1】:

好的,我想我明白你在问什么了。您正在寻找 findin() 函数。它需要两个参数,每个参数都是一个集合。它找到第二个集合中的第一个集合的元素,并返回这些元素的索引。因此,我们可以将此函数应用于数组第一维的切片。下面是例子,为了简单起见,从 2D 开始,然后推广到 3D,其实基本一样。

请注意,必须沿第二维和第三维选择特定的索引(这里我为每个选择了 1),否则,第一维切片中没有确定的元素可以与b 的内容进行比较。 (在这种情况下,每个维度仅提供一组 3 个数字的一​​部分,它们一起标识 3D 数组中的特定位置)。

b = rand(100);
using Distributions
indices = sample(1:1000, 100, replace=false) ## random indices for where the elements in a slice of the first dimension of A will match those in b.

## 2D example
A = rand(1000,100);
A[indices,1] = b; ## set 100 random rows of A will now have their first element match one element of b
Ared = A[findin(A[:,1], b),:]  ## find the rows in A where the first element is in B.  Return the full values of those rows.

## 3D example
A3 = rand(1000,10,100);
A3[indices,1,1] = b;
Ared3 = A3[findin(A[:,1,1], b),:,:];
julia> size(Ared3)
(100,10,100)

【讨论】:

  • 感谢您的快速回答!您写道,“A 的 100 个随机行现在将使其第一个元素与 b 的一个元素匹配”与之前匹配的那些行不同吗?
  • @Hainmueck 这只是为了创造匹配可以首先发生的情况。换句话说,由于我实际上无法访问您正在使用的矩阵A 和向量b,因此我需要模拟一个矩阵A 与某个匹配的情况矢量b。如果没有这个,如果我只是从随机的A 和随机的b 开始,那么就不太可能存在很多匹配项(取决于我如何进行随机抽签)。
  • @Hainmueck 换句话说,这些行只是我为您制作一个最小的可重现示例的工作;将来您可以努力将其纳入您自己的问题中。有关详细信息,请参阅here
【解决方案2】:

你的逻辑很好,如果 b 是一个向量。它没有的原因是您可能正在尝试使用二维数组(即排名 2)进行索引,该数组恰好只有一列,而不是向量(即排名 1)数组。 IE。我敢肯定,如果你这样做size(b),结果将是(2,1),而不是应该是的(2,)

如果您获得 b 的相应向量(例如 collect(b) ),您的索引操作应该可以正常工作。

例子:

julia> A = rand(Int64[1,10],3,4,2)
3x4x2 Array{Int64,3}:
[:, :, 1] =
 10  10   1  10
 10  10  10  10
  1  10  10   1

[:, :, 2] =
 1  10  10   1
 1  10   1   1
 1   1  10  10

julia> b = [1; 3]    # this will work. NOTE THE RESULTING TYPE!
2-element Array{Int64,1}:
 1
 3

julia> A[b,:,:]
2x4x2 Array{Int64,3}:
[:, :, 1] =
 10  10   1  10
  1  10  10   1

[:, :, 2] =
 1  10  10   1
 1   1  10  10

julia> c = [1 3]'    # this will not. NOTE THE RESULTING TYPE
2x1 Array{Int64,2}:
 1
 3

julia> A[c,:,:]
ERROR: MethodError: `index_shape_dim` has no method matching     index_shape_dim(::Array{Int64,3}, ::Int64, ::Array{Int64,2}, ::Colon, ::Colon)

julia> A[collect(c),:,:]    # this will work again, c is now a vector
2x4x2 Array{Int64,3}:
[:, :, 1] =
 10  10   1  10
  1  10  10   1

[:, :, 2] =
 1  10  10   1
 1   1  10  10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多