accumarray()的 val
论点必须是一个向量.在我的情况下,我需要矩阵的列被求和(或平均).是否有功能或方法来实现这一目标?
我现在正在做的是for循环我分别对列值进行求和:
for iCol = 1:nCols
means(:,iCol) = accumarray(labels', X(:,iCol));
end
Run Code Online (Sandbox Code Playgroud) 精简版:
作为第四个参数传递的函数accumarray
有时会被调用,其参数与编写第一个参数的规范不一致accumarray
.
因此,用作参数的函数accumarray
必须测试实际上是异常条件的内容.
问题是:如何对这种异常条件进行1表达式匿名函数测试?更一般地说:如何编写对accumarray
未记录的行为具有鲁棒性的匿名函数?
完整版本:
下面的代码是我今天大部分工作日的问题的彻底提炼版本.
首先是一些定义:
idxs = [1:3 1:3 1:3]';
vals0 = [1 4 6 3 5 7 6 Inf 2]';
vals1 = [1 Inf 6 3 5 7 6 4 2]';
anon = @(x) max(x(~isinf(x)));
Run Code Online (Sandbox Code Playgroud)
注释vals1
是vals0
通过交换元素2和8获得的."匿名"函数anon
计算其输入的非无限元素中的最大值.
鉴于这些定义,下面两个调用
accumarray(idxs, vals0, [], anon)
accumarray(idxs, vals1, [], anon)
Run Code Online (Sandbox Code Playgroud)
其区别仅在于在其第二个参数(vals0
VS vals1
)时,应产生相同的结果,因为之间的差vals0
和vals1
只影响在该参数的值与所述呼叫的一个排序anon
,并且该函数的结果是不敏感的排序其论点中的元素.
事实证明,这两个表达式中的第一个正常评估并产生正确的结果1:
>> accumarray(idxs, vals0, …
Run Code Online (Sandbox Code Playgroud) 我正在寻找有关如何优雅地解决以下问题的建议.虽然在我的具体案例中表现不是问题,但我会对有关良好做法的评论表示赞赏.
提前致谢!
我试图根据一些逻辑平均矩阵行,而忽略NaN值.我目前的代码没有按照我想要的方式处理NaN值.
我的数据以下列方式构建:
这是一个例子:
DATA = [...
180 NaN NaN 1.733
180 NaN NaN 1.703
200 0.720 2.117 1.738
200 0.706 2.073 1.722
200 0.693 2.025 1.723
200 NaN NaN 1.729
210 NaN NaN 1.820
210 NaN NaN 1.813
210 NaN NaN 1.805
240 NaN NaN 1.951
240 NaN NaN 1.946
240 NaN NaN 1.946
270 NaN NaN 2.061
270 NaN NaN 2.052
300 0.754 2.356 2.103
300 0.758 2.342 2.057
300 NaN …
Run Code Online (Sandbox Code Playgroud) 我最近偶然发现了numba,并考虑用更优雅的autojitted python代码替换一些自制的C扩展.不幸的是,当我尝试第一个快速基准时,我并不高兴.看起来numba在这里并没有比普通的python好多少,虽然我本来期待几乎类似C的性能:
from numba import jit, autojit, uint, double
import numpy as np
import imp
import logging
logging.getLogger('numba.codegen.debug').setLevel(logging.INFO)
def sum_accum(accmap, a):
res = np.zeros(np.max(accmap) + 1, dtype=a.dtype)
for i in xrange(len(accmap)):
res[accmap[i]] += a[i]
return res
autonumba_sum_accum = autojit(sum_accum)
numba_sum_accum = jit(double[:](int_[:], double[:]),
locals=dict(i=uint))(sum_accum)
accmap = np.repeat(np.arange(1000), 2)
np.random.shuffle(accmap)
accmap = np.repeat(accmap, 10)
a = np.random.randn(accmap.size)
ref = sum_accum(accmap, a)
assert np.all(ref == numba_sum_accum(accmap, a))
assert np.all(ref == autonumba_sum_accum(accmap, a))
%timeit sum_accum(accmap, a)
%timeit autonumba_sum_accum(accmap, a)
%timeit numba_sum_accum(accmap, …
Run Code Online (Sandbox Code Playgroud) 什么是服用的阵列的最快方式A
和outputing二者unique(A)
[即所述一组唯一的数组元素A
]以及多重阵列这需要在其第i个位置的第i个条目的第i个多重性unique(A)
的A
.
这是一个满口,所以这是一个例子.鉴于A=[1 1 3 1 4 5 3]
,我想:
unique(A)=[1 3 4 5]
mult = [3 2 1 1]
这可以通过繁琐的for循环来完成,但是想知道是否有办法利用MATLAB的数组特性.
因此,我目前正在使用'accumarray'来查找与匹配ID相对应的一系列数字的平均值.输入输入:
ID----Value
1 215
1 336
1 123
2 111
2 246
2 851
Run Code Online (Sandbox Code Playgroud)
我当前的代码找到上述值的未加权平均值,使用ID作为'分隔符',这样我就不会将所有值的平均值作为一个数字一起得到,而是仅将具有相应ID的值的单独结果分开.EX输出:
ID----Value
1 224.66
2 402.66
Run Code Online (Sandbox Code Playgroud)
为此,我使用此代码:
[ID, ~, Groups] = unique(StarData2(:,1),'stable');
app = accumarray(Groups, StarData2(:,2), [], @mean);
Run Code Online (Sandbox Code Playgroud)
使用StarData2作为函数的输入.这对我的目的来说是完美的,直到现在,我需要知道是否可以使用accumarray给我一个加权平均值,这样app中的每个点(在找到平均值之前)都可以赋予权重或@mean可以被替换为可以实现此目的的功能.新输入将如下所示:
ID----Value----Weight
1 215 12
1 336 17
1 123 11
2 111 6
2 246 20
2 851 18
Run Code Online (Sandbox Code Playgroud)
新代码必须求和(val(i)*weight(i))/ sum(weight)而不仅仅是标准均值.谢谢你的帮助.
我有两个数组:
OTPCORorder = [61,62,62,62,62,62,62,62,62,62,62,62,65,65,...]
AprefCOR = [1,3,1,1,1,1,1,1,1,1,2,3,3,2,...]
Run Code Online (Sandbox Code Playgroud)
对于OTPCORorder中的每个元素,AprefCOR中都有一个对应的元素.我想知道每组唯一OTPCORorder的数字1的百分比如下:
OTPCORorder1 = [61,62,65,...]
AprefCOR1 = [1,0.72,0,...]
Run Code Online (Sandbox Code Playgroud)
我已经有了这个:
[OTPCORorder1,~,idx] = unique(OTPCORorder,'stable');
ANS = OTPCORorder1 = [61,62,65,...];
Run Code Online (Sandbox Code Playgroud)
我曾经使用过"accumarray",但我使用了"mean"或"sum"这样的功能:
AprefCOR1 = accumarray(idx,AprefCOR,[],@mean).';
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否存在一种方法来使用它,但是使用"prctile"函数或任何其他函数给出了特定元素的百分比,例如在这种情况下为"1".
非常感谢你.
accumarray
使用两行索引来创建一个矩阵,该矩阵在有效索引对的位置上具有由指定函数指定的值的元素,例如:
A = [11:20];
B = flipud([11:20]);
C = 1:10;
datamatrix = accumarray([A B],C);
Run Code Online (Sandbox Code Playgroud)
这种方式datamatrix
将是一个20x20
带有值的矩阵.如果值A
以及B
但是都非常大,这将导致大部分是空的矩阵,在远角小批量的数据.为了避免这种情况,可以设置accumarray
为issparse
:
sparsedatamatrix = accumarray([A B],C,[],@sum,[],true);
Run Code Online (Sandbox Code Playgroud)
这将节省大量内存min(A)
和/或min(B)
非常大.
然而,我的问题是我有一个Mx7
矩阵,M~1e8
我希望根据前两列中的索引收集第三列到第七列的方法,以及基于第三列的第三列的标准偏差:
result = accumarray([data(:,1) data(:,2)],data(:,3),[],@std);
Run Code Online (Sandbox Code Playgroud)
我想保存此回一个表,构成为[X Y Z std R G B I]
,在这里X
和Y
是指数,Z
是该像素的平均高度,R
,G
,B
和I
是每个象素的平均值(颜色和强度)和std
是高度的标准偏差(即粗糙度).使用issparse
在这种情况下没有帮助,因为我改变我的矩阵日起,accumarray
使用repmat
.
该代码的要点是从点云估计一块土地的高度,粗糙度,颜色和强度.我舍入了X和Y中的坐标来创建一个网格,现在需要每个网格单元的平均值,但输出为"表"(不是MATLAB数据类型,而是一个不是默认矩阵输出的2D数组).
那么,总结一下这个问题: …
MATLAB的内置函数accumarray
接受函数fun
作为第四个参数.
A = accumarray(subs,val,sz,fun);
Run Code Online (Sandbox Code Playgroud)
这适用fun
于val
具有相同下标的元素的每个子集subs
.但文件说明:
如果下标
subs
未按其线性索引排序,则fun
不应取决于其输入数据中值的顺序.
我们如何实现一个没有这个限制的稳定版本accumarray
,但是会保证子集采用与给定的相同的顺序val
?
例:
subs = [1:10,1:10];
val = 1:20;
accumarray(subs(:), val(:), [], @(x)x(end)).'
Run Code Online (Sandbox Code Playgroud)
这样做的预计产出将是11:20
,如果accumarray
是稳定的.实际上输出是:
ans =
11 12 13 14 5 6 7 18 19 20
Run Code Online (Sandbox Code Playgroud)
我们的实施应该产生:
accumarrayStable(subs(:), val(:), [], @(x)x(end)).'`
ans =
11 12 13 14 15 16 17 18 19 20
Run Code Online (Sandbox Code Playgroud) 我有以下代码,从数据集("DATA")计算百分位数非常慢,因为输入矩阵很大("数据"大约500.000长,10080个唯一值从"指数"分配) .
是否有可能/建议使这段代码更有效率?例如,我可以以某种方式省略for循环吗?
k = 1;
for i = 0:0.5:100; % in 0.5 fractile-steps
FRACTILE(:,k) = accumarray(Indices,Data,[], @(x) prctile(x,i));
k = k+1;
end
Run Code Online (Sandbox Code Playgroud) 只要我理解accumarray,它的意思是“制作输出的第n行:1)在sub中找到n。2)如果n在sub中的m1,m2,m3个元素中,3)将函数应用于m1,m2 ,m3 val 4) 的第一个元素,这是输出的第 n 行”
我有什么地方说错了吗?
我运行了以下代码。
A = [2 10 13 ; 1 11 14; 1 12 10]
[U,ix,iu]= unique(A(:,1))
vals = reshape(A(:, 2:end).', [], 1)
subs = reshape(iu(:, ones(size(A, 2)-1,1)).', [], 1)
r2 = accumarray(subs, vals', [], @(x){x'})
r2{1}
r2{2}
Run Code Online (Sandbox Code Playgroud)
A=
2 10 13
1 11 14
1 12 10
Run Code Online (Sandbox Code Playgroud)
U=
1
2
Run Code Online (Sandbox Code Playgroud)
九 =
3
1
Run Code Online (Sandbox Code Playgroud)
国际单位 =
2
1
1
Run Code Online (Sandbox Code Playgroud)
值=
10
13
11
14
12
10
Run Code Online (Sandbox Code Playgroud)
替补=
2
2
1
1
1
1 …
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的矩阵:
>>D=[1,0,10;3,1,12;3,1,12.5;6,1,6;6,2,11.1;]
D =
1.0000 0 10.0000
3.0000 1.0000 12.0000
3.0000 1.0000 12.5000
6.0000 1.0000 6.0000
6.0000 2.0000 11.1000
Run Code Online (Sandbox Code Playgroud)
如果第一列的数据相同,我想得到第二列数据的总和.例如,我想要:
E=
1.0000 0
3.0000 2.0000
6.0000 3.0000
Run Code Online (Sandbox Code Playgroud)
所以我试过了
b = accumarray(D(:,1),D(:,2),[],[],[],true);
[i,~,v] = find(b);
E = [i,v]
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我该怎么办?
accumarray ×12
matlab ×11
arrays ×3
grouping ×2
matrix ×2
accumulate ×1
average ×1
jit ×1
mean ×1
nan ×1
numba ×1
numpy ×1
percentage ×1
percentile ×1
python ×1
stable-sort ×1
unique ×1