ksw*_*ksw 6 python numpy function
我正在尝试将函数应用于 numpy 数组中的每一对列(每列都是一个人的基因型)。
例如:
[48]: g[0:10,0:10]
array([[ 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, 1, 1, 1, 1, 1, 1, 1, 1],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1],
[-1, -1, 0, -1, -1, -1, -1, -1, -1, 0],
[ 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]], dtype=int8)
Run Code Online (Sandbox Code Playgroud)
我的目标是生成一个距离矩阵 d,以便 d 的每个元素都是比较 g 中每一列的成对距离。
d[0,1] = func(g[:,0], g[:,1])
Run Code Online (Sandbox Code Playgroud)
任何想法都会很棒!谢谢!
您可以使用 创建所需的对np.dstack
,然后使用 在第三轴上应用该函数np.apply_along_axis
。
new = np.dstack((arr[:,:-1], arr[:, 1:]))
np.apply_along_axis(np.sum, 2, new)
Run Code Online (Sandbox Code Playgroud)
例子 :
In [86]: arr = np.array([[ 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, 1, 1, 1, 1, 1, 1, 1, 1],
...: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
...: [ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1],
...: [-1, -1, 0, -1, -1, -1, -1, -1, -1, 0],
...: [ 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]], dtype=np.int8)
...:
...:
In [87]: new = np.dstack((arr[:,:-1], arr[:, 1:]))
In [88]: new
Out[88]:
array([[[ 1, 1],
[ 1, 1],
[ 1, 1],
[ 1, 1],
[ 1, 1],
[ 1, 1],
[ 1, 1],
[ 1, 1],
[ 1, -1]],
...
In [89]:
In [89]: np.apply_along_axis(np.sum, 2, new)
Out[89]:
array([[ 2, 2, 2, 2, 2, 2, 2, 2, 0],
[ 2, 2, 2, 2, 2, 2, 2, 2, 2],
[ 2, 2, 2, 2, 2, 0, 0, 2, 2],
[ 2, 2, 2, 2, 2, 2, 2, 2, 2],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 2, 2, 2, 2, 2, 2, 2, 2, 0],
[-2, -1, -1, -2, -2, -2, -2, -2, -1],
[ 2, 2, 2, 2, 2, 2, 2, 2, 2],
[ 2, 2, 2, 2, 2, 2, 2, 2, 2],
[ 2, 2, 2, 2, 2, 2, 2, 2, 2]])
Run Code Online (Sandbox Code Playgroud)