我想对块矩阵(或更一般地在 d-dim nd.array 上)执行一些简单的计算。像这样的东西:
图中,大写字母代表一个3×3的块矩阵,小写字母代表数字(块矩阵的均值或总和)。
目前,我只知道如何使用 for 循环来做到这一点
import numpy as np
test_matrix = np.arange(81).reshape(9,9)
a = np.zeros((3,3))
for i in range(3):
for j in range(3):
a[k,i,j] = test_matrix[3*i:3*(i+1),3*j:3*(j+1)].mean()
print a
Run Code Online (Sandbox Code Playgroud)
但是如果我的矩阵变大或多维,它会变慢,例如:
test_matrix = np.arange(81*2).reshape(2,9,9)
a = np.zeros((2,3,3))
for k in range(2):
for i in range(3):
for j in range(3):
a[k,i,j] = test_matrix[k,3*i:3*(i+1),3*j:3*(j+1)].mean()
print a
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来执行此类任务?
非常感谢!!
我正在寻找一个Bash单行程序,它为列表中的每个项目调用一次函数.例如,给出列表
foo bar baz和程序"cowsay",它会产生:
_____
< foo >
-----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
_____
< bar >
-----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
_____
< baz >
-----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Run Code Online (Sandbox Code Playgroud)
(也许中间有其他文字,并不重要)
我知道我可以使用bash脚本执行此操作:
#!/bin/sh
for w in $@; do
cowsay $w
done
Run Code Online (Sandbox Code Playgroud)
但我无法想象没有其他办法可以做到这一点.
编辑:我认为我在最初的问题上并不是很清楚.我希望能够在不编写bash脚本的情况下执行此类操作:
locate foo | sed s/bar/baz/ | [other-processing] | [insert-magic-here] cowsay
Run Code Online (Sandbox Code Playgroud)
关键是我试图避免编写脚本,以便我可以将它添加到我的管道链而不考虑它.
给定一个整数计数数组c,如何将其转换为整数数组,inds这np.all(np.bincount(inds) == c)是真的?
例如:
>>> c = np.array([1,3,2,2])
>>> inverse_bincount(c) # <-- what I need
array([0,1,1,1,2,2,3,3])
Run Code Online (Sandbox Code Playgroud)
上下文:我正在尝试跟踪多组数据的位置,同时对所有数据进行计算.我将所有数据连接在一起进行批处理,但我需要一个索引数组来提取结果.
目前的解决方法:
def inverse_bincount(c):
return np.array(list(chain.from_iterable([i]*n for i,n in enumerate(c))))
Run Code Online (Sandbox Code Playgroud) 考虑以下:
var foo = []
for (var i=0; i<100000; i++) { foo.push(97); }
var bar = String.fromCharCode.apply(String,foo)
Run Code Online (Sandbox Code Playgroud)
大多数浏览器运行良好,但Safari抛出: RangeError: Maximum call stack size exceeded.
基于此,似乎Safari的Function.prototype.apply实现是递归的.这是真的?
上面链接的MDN页面提到了JS引擎的参数长度限制的潜在问题,但这显然不是这里的情况.
编辑:我仍然不认为这是一个论证长度问题.通过这个页面和我自己的测试,看起来Safari可以处理多达524197个参数,上面的代码不会超过这些参数.
额外的问题:我们可以重写上面的代码,以避免通过显式调用String.fromCharCode数组的每个元素join并将结果放在一起来使用apply ,但我怀疑它会更慢(对于支持大输入的浏览器apply).从整数字符代码数组中组装大字符串的最佳方法是什么?
这是我正在尝试做的最小例子.我正在计算矩阵之间的成对距离,我已将其排列成堆叠阵列.该idx阵列保存每个子矩阵的偏移量.
当我删除parallel()和替换prange用range的代码按预期工作(只是不平行,当然).
import numpy as np
cimport numpy as np
cimport cython
from cython.parallel import parallel, prange
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.nonecheck(False)
def all_pairs_distance(float[:,::1] stacked, int[::1] idx):
cdef int n = idx.shape[0] - 1
cdef float[:,::1] D = np.zeros((n,n), dtype='float32')
cdef int i,j
cdef float[:,::1] t1,t2
cdef float d
with nogil, parallel():
for i in prange(n):
t1 = stacked[idx[i]:idx[i+1],:]
for j in range(i+1, n):
t2 = stacked[idx[j]:idx[j+1],:]
d = nogil_cython_function(t1, t2)
D[i,j] = d …Run Code Online (Sandbox Code Playgroud)