Julia 中的扫描等价物
Sweep equivalent in Julia
来自 R 文档:
sweep
: Return an array obtained from an input array by sweeping out a summary
statistic.
例如,这是我将每一行除以其行总和的方法:
> rs = rowSums(attitude)
> ratios = sweep(attitude, 1, rs, FUN="/")
> head(ratios)
rating complaints privileges learning raises critical advance
1 0.1191136 0.1412742 0.08310249 0.1080332 0.1689751 0.2548476 0.12465374
2 0.1518072 0.1542169 0.12289157 0.1301205 0.1518072 0.1759036 0.11325301
3 0.1454918 0.1434426 0.13934426 0.1413934 0.1557377 0.1762295 0.09836066
4 0.1568123 0.1619537 0.11568123 0.1208226 0.1388175 0.2159383 0.08997429
5 0.1680498 0.1618257 0.11618257 0.1369295 0.1473029 0.1721992 0.09751037
6 0.1310976 0.1676829 0.14939024 0.1341463 0.1646341 0.1493902 0.10365854
> rowSums(ratios) # check that ratios sum up to 1
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
我在 Julia 中的尝试:
x = rand(3, 4)
x[1, 1] = 10
x[2, 1] = 20
x[3, 1] = 30
rowsum = sum(x, 2)
rowsum_mat = repmat(rowsum, 1, size(x, 2))
x = x ./ rowsum_mat
这有效但很笨重。有没有更优雅、更有效的方法来做到这一点?
无需使用 repmat
— Julia 的所有 .
-运算符默认都使用 "broadcasting"。这意味着它匹配两个参数的维度,然后扩展任何长度为 1 的维度(单一维度)以匹配另一个数组。由于缩减保持与源数组相同的维数,因此它们可以直接用于任何 dot-operator.
在你的情况下,你可以使用:
x ./ sum(x, 2)
自从:
julia> x ./ rowsum_mat == x ./ rowsum
true
来自 R 文档:
sweep
: Return an array obtained from an input array by sweeping out a summary statistic.
例如,这是我将每一行除以其行总和的方法:
> rs = rowSums(attitude)
> ratios = sweep(attitude, 1, rs, FUN="/")
> head(ratios)
rating complaints privileges learning raises critical advance
1 0.1191136 0.1412742 0.08310249 0.1080332 0.1689751 0.2548476 0.12465374
2 0.1518072 0.1542169 0.12289157 0.1301205 0.1518072 0.1759036 0.11325301
3 0.1454918 0.1434426 0.13934426 0.1413934 0.1557377 0.1762295 0.09836066
4 0.1568123 0.1619537 0.11568123 0.1208226 0.1388175 0.2159383 0.08997429
5 0.1680498 0.1618257 0.11618257 0.1369295 0.1473029 0.1721992 0.09751037
6 0.1310976 0.1676829 0.14939024 0.1341463 0.1646341 0.1493902 0.10365854
> rowSums(ratios) # check that ratios sum up to 1
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
我在 Julia 中的尝试:
x = rand(3, 4)
x[1, 1] = 10
x[2, 1] = 20
x[3, 1] = 30
rowsum = sum(x, 2)
rowsum_mat = repmat(rowsum, 1, size(x, 2))
x = x ./ rowsum_mat
这有效但很笨重。有没有更优雅、更有效的方法来做到这一点?
无需使用 repmat
— Julia 的所有 .
-运算符默认都使用 "broadcasting"。这意味着它匹配两个参数的维度,然后扩展任何长度为 1 的维度(单一维度)以匹配另一个数组。由于缩减保持与源数组相同的维数,因此它们可以直接用于任何 dot-operator.
在你的情况下,你可以使用:
x ./ sum(x, 2)
自从:
julia> x ./ rowsum_mat == x ./ rowsum
true