小编per*_*iae的帖子

在numpy中取块矩阵的均值/总和的最佳方法?

我想对块矩阵(或更一般地在 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)

有没有更好的方法来执行此类任务?

非常感谢!!

python numpy matrix

5
推荐指数
1
解决办法
1672
查看次数

在bash中执行for-each

我正在寻找一个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)

关键是我试图避免编写脚本,以便我可以将它添加到我的管道链而不考虑它.

bash

4
推荐指数
3
解决办法
1万
查看次数

逆numpy的bincount函数

给定一个整数计数数组c,如何将其转换为整数数组,indsnp.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)

python numpy

4
推荐指数
1
解决办法
654
查看次数

为什么Safari会递归调用function.apply?

考虑以下:

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).从整数字符代码数组中组装大字符串的最佳方法是什么?

javascript safari

3
推荐指数
1
解决办法
569
查看次数

与Cython内存视图并行化

这是我正在尝试做的最小例子.我正在计算矩阵之间的成对距离,我已将其排列成堆叠阵列.该idx阵列保存每个子矩阵的偏移量.

当我删除parallel()和替换prangerange的代码按预期工作(只是不平行,当然).

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)

parallel-processing cython

3
推荐指数
1
解决办法
2167
查看次数

标签 统计

numpy ×2

python ×2

bash ×1

cython ×1

javascript ×1

matrix ×1

parallel-processing ×1

safari ×1