Arrays Julia-用向量提取多维矩阵的一部分
我试图用向量来简化多维矩阵 假设矩阵A是1000 x 10 x 100。Arrays Julia-用向量提取多维矩阵的一部分,arrays,matrix,julia,Arrays,Matrix,Julia,我试图用向量来简化多维矩阵 假设矩阵A是1000 x 10 x 100。 向量b可以是100 x 1,其中100个条目是A的第一维度的一部分。A的第一维度的切片中始终只有一个元素与b的每个元素匹配 如何将矩阵简化为匹配向量 我试过了 Ared= A[b,:,:] 但它不起作用 本例中的新矩阵的形式应为100 x 10 x 100 有人有什么想法吗?好的,我想我明白你的意思了。您正在寻找findin()函数。它接受两个参数,每个参数都是一个集合。它查找第一个集合中位于第二个集合中的元素,并返回这
向量b可以是100 x 1,其中100个条目是A的第一维度的一部分。A的第一维度的切片中始终只有一个元素与b的每个元素匹配 如何将矩阵简化为匹配向量 我试过了
Ared= A[b,:,:]
但它不起作用
本例中的新矩阵的形式应为100 x 10 x 100
有人有什么想法吗?好的,我想我明白你的意思了。您正在寻找
findin()
函数。它接受两个参数,每个参数都是一个集合。它查找第一个集合中位于第二个集合中的元素,并返回这些元素的索引。因此,我们可以将此函数应用于数组第一维的切片。下面是一些例子,为了简单起见,从2D开始,然后推广到3D,基本上是一样的
请注意,有必要沿第二维度和第三维度选择特定的索引(这里我为每个维度选择1),因为否则,第一维度切片中没有明确的元素可与b
的内容进行比较。(在本例中,每个维度仅提供一组3个数字的一部分,这些数字共同标识3D阵列中的特定位置)
如果b是一个向量,那么您的逻辑很好,并且可以工作。它不存在的原因是,您可能正在尝试使用二维数组(即秩2)进行索引,而该数组恰好只有一列,而不是向量(即秩1)数组。也就是说,我确信如果你做了
尺寸(b)
,结果将是(2,1)
,而不是(2,1)
,这是它应该做的
如果获得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
在A的第一维度中,始终只有一个元素与b的每个元素匹配。我不完全理解你的第二个问题。一般来说,我想创建一个与原始矩阵形状相同的新矩阵,但第一个维度被缩减为向量b。你的问题模棱两可,并吸引了两个相互矛盾但可能有效的答案,这取决于你实际想要的是什么;你能具体说明你想要什么吗?例如,如果“A”是
A=重塑(0.1:0.1:2.4,3,4,2)
且b是2元素向量,您能否给出b
和预期输出的示例?b
是要用于选择a
子范围的行索引向量吗?(例如b=[1;3]
)或者您是说“b可以从A(1,:,:)
中的可用值中获取任意两个值”(例如b=[0.4;1.9]
)?请澄清。如果是前者,请使用我的答案。如果是后者,请使用Michael的答案。如果两者都不是,请用适当的例子重新措辞并澄清您的问题。第一个答案解决了我的问题,但第二个答案在总体上也很有帮助。非常感谢您的帮助。很高兴您将其分类。请标记aNSWER你认为正确的接受,为未来的观众。(我仍然不确定你指的是哪一个,哈哈)谢谢你的快速回答!你写道,“100个随机行的意志现在有他们的第一个元素匹配的一个元素的B。“这些行与之前匹配的行不一样吗?@Hainmueck这只是为了创造一种情况,让匹配首先发生。换句话说,由于我实际上无法访问您使用的矩阵A
和向量b
,因此我需要模拟一种情况,在这种情况下,矩阵A
与向量b
具有某些匹配项。如果没有这一点,如果我只是从随机a
和随机b
开始,那么不太可能存在许多匹配项(取决于我随机抽取的方式)。@Hainmueck换句话说,这些行只是我的工作,为您生成一个最小的可复制示例;你可以在将来的问题中加入一些东西。有关这方面的更多详细信息,请参阅。
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