小编aph*_*aph的帖子

将元组列表转换为结构化的numpy数组

我有一个Num_tuples元组列表,它们都具有相同的长度Dim_tuple

xlist = [tuple_1, tuple_2, ..., tuple_Num_tuples]
Run Code Online (Sandbox Code Playgroud)

确切地说,让我们说Num_tuples = 3和Dim_tuple = 2

xlist = [(1, 1.1), (2, 1.2), (3, 1.3)]
Run Code Online (Sandbox Code Playgroud)

我想使用用户提供的列名user_names列表和用户提供的变量类型列表user_typesxlist转换为结构化的numpy数组xarr

user_names = [name_1, name_2, ..., name_Dim_tuple]
user_types = [type_1, type_2, ..., type_Dim_tuple]
Run Code Online (Sandbox Code Playgroud)

所以在创建numpy数组时,dtype = [(name_1,type_1),(name_2,type_2),...,(name_Dim_tuple,type_Dim_tuple)]

在我的玩具示例中,所需的最终产品看起来像:

xarr['name1']=np.array([1,2,3])
xarr['name2']=np.array([1.1,1.2,1.3])
Run Code Online (Sandbox Code Playgroud)

如何切片xlist创建没有任何循环的xarr

python arrays numpy

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

使用scipy高斯核密度估计计算CDF逆

gaussian_kde函数scipy.stats具有如下功能:evaluate即可以返回一个输入点的PDF的值。我试图用来gaussian_kde估计逆 CDF。动机是生成一些输入数据的蒙特卡罗实现,其统计分布使用 KDE 进行数值估计。是否有绑定gaussian_kde到此目的的方法?

下面的例子展示了在高斯分布的情况下这应该如何工作。首先,我展示了如何进行 PDF 计算以设置我想要实现的特定 API:

import numpy as np 
from scipy.stats import norm, gaussian_kde

npts_kde = int(5e3)
n = np.random.normal(loc=0, scale=1, size=npts_kde)
kde = gaussian_kde(n)

npts_sample = int(1e3)
x = np.linspace(-3, 3, npts_sample)
kde_pdf = kde.evaluate(x)
norm_pdf = norm.pdf(x)
Run Code Online (Sandbox Code Playgroud)

正态分布 PDF 的 KDE 近似演示

是否有类似的简单方法来计算逆 CDF?该norm函数有一个非常方便的isf函数,可以做到这一点:

cdf_value = np.sort(np.random.rand(npts_sample))
cdf_inv = norm.isf(1 - cdf_value)
Run Code Online (Sandbox Code Playgroud)

正态分布 CDF 的所需 KDE 近似演示

是否存在这样的函数kde_gaussian?或者从已经实现的方法构造这样的函数是否很简单?

python numpy scientific-computing scipy

7
推荐指数
1
解决办法
7088
查看次数

在numpy数组中循环使用python生成器

我的代码中的速度瓶颈是两个数组x和y的元素循环的两倍.用于提高性能的标准hpc技巧是以块的形式进行循环,以便可以最小化缓存未命中.我正在尝试使用python生成器来进行分块,但是需要在外部for循环中不断重新创建耗尽的生成器,这会杀死我的运行时.

题:

是否有更智能的算法来构造适当的生成器来执行chunked double-for循环?

具体插图:

我将创建两个虚拟数组,xy.我会简短地说明它们,但实际上这些是带有~1e6元素的numpy数组.

x = np.array(['a', 'b', 'b', 'c', 'c', 'd'])
y = np.array(['e', 'f', 'f', 'g'])
Run Code Online (Sandbox Code Playgroud)

天真的双循环只是:

for xletter in x:
    for yletter in y:
        # algebraic manipulations on x & y
Run Code Online (Sandbox Code Playgroud)

现在让我们使用生成器以块的形式执行此循环:

chunk_size = 3
xchunk_gen = (x[i: i+chunk_size] for i in range(0, len(x), chunk_size))
for xchunk in xchunk_gen:
    ychunk_gen = (y[i: i+chunk_size] for i in range(0, len(y), chunk_size))
    for ychunk in ychunk_gen:
        for xletter in xchunk:
            for yletter in ychunk: …
Run Code Online (Sandbox Code Playgroud)

python performance numpy generator cython

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

用于评估相同长度的1d numpy阵列上的1-d函数数组的并行算法

下面的结果是我有一个令人尴尬的并行for循环,我试图解决.解释这个问题还有一些麻烦,但尽管所有问题都很冗长,但我认为这应该是一个相当简单的问题,多处理模块的设计很容易解决.

我有一个由k个不同函数组成的大长度N数组,以及一个长度为N的abcissa数组.由于@senderle提供的聪明的解决方案在高效算法中描述,用于评估相同长度的1d numpy数组上的1-d函数数组,我有一个快速的基于numpy的算法,我可以用它来评估abcissa的函数返回长度为N的纵坐标数组:

def apply_indexed_fast(abcissa, func_indices, func_table):
    """ Returns the output of an array of functions evaluated at a set of input points 
    if the indices of the table storing the required functions are known. 

    Parameters 
    ----------
    func_table : array_like 
        Length k array of function objects

    abcissa : array_like 
        Length Npts array of points at which to evaluate the functions. 

    func_indices : array_like 
        Length Npts array providing the indices to use to choose which …
Run Code Online (Sandbox Code Playgroud)

python parallel-processing performance numpy scientific-computing

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

在 cython 中生成高斯随机数的最有效和可移植的方法是什么?

我正在编写一个 cython 应用程序,我需要在紧密的嵌套循环中动态生成高斯随机变量。我想在不引入任何额外依赖项(例如 GSL)的情况下执行此操作。

对于我目前能够使用统一随机数即时执行此操作的最小版本:

from libc.stdlib cimport rand, RAND_MAX
import numpy as np

cdef double random_uniform():
    cdef double r = rand()
    return r/RAND_MAX

def my_function(int n):
    cdef int i
    cdef double[:] result = np.zeros(n, dtype='f8', order='C')
    for i in range(n):
        result[i] = random_uniform()
    return result
Run Code Online (Sandbox Code Playgroud)

上面的代码在功能上等同于 numpy.random.rand(n),并且可以使用以下最小设置文件进行编译:

from distutils.core import setup
from Cython.Build import cythonize
import numpy as np

setup(ext_modules=cythonize("example.pyx"), include_dirs=[np.get_include()])

# compile instructions:
# python setup.py build_ext --inplace
Run Code Online (Sandbox Code Playgroud)

为了回答这个问题,我正在寻找的是与 np.random.randn(n) 功能等效的相同类型的最小解决方案,同样理想的是出于可移植性的原因直接从 libc.stdlib 导入任何依赖项。

维基百科条目上有Box-Muller 算法的 …

python performance numpy scientific-computing cython

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

带有对数轴的 matplotlib 图,但没有科学/指数符号

我正在制作一个 x 轴应以对数间隔排列的图形,但我想手动设置刻度标签,并且我希望刻度标签以普通的 '%.2f' 表示法出现,而不是指数表示法。以下基于Matplotlib 的解决方案- 对数标度,但需要非对数标签建议使用 ScalarFormatter,但不适用于 matplotlib 2.0:

x = np.logspace(2, 3, 100)
y = x

fig, ax = plt.subplots(1, 1)
xscale = ax.set_xscale('log')
ax.set_xticks((100, 200, 300, 500))
xlim = ax.set_xlim(100, 1000)

from matplotlib.ticker import ScalarFormatter
ax.get_xaxis().set_major_formatter(ScalarFormatter())

__=ax.plot(x, y)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

python plot matplotlib

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

用于扩展分组表格数据的高效算法

我在python中寻找一个优化的工具来执行一个数组操作任务,我发现自己一遍又一遍地做.如果该工具已经存在,例如在numpy或pandas中,我宁愿实现,而是继续使用我自己的cythonized for循环.

我有两个相同长度的数组,A和B,存储有关分组数据的一些数据.数组A的第i个条目告诉我第i组的一些属性; 数组B的第j个条目告诉我j组中有多少成员; 商店花车,B商店注册.因此,为了确定性,如果A [5] = 100.4&B [5] = 7,则组5的质量等于100.4,并且该组中有7个成员.

我的目标是创建一个新的浮点数组C,长度为B.sum(),这是上述数据集的扩展.所以C [0:B [0]] = A [0],C [B [0]:B [1]] = A [1],依此类推.是否有优化的解决方案可以在现有的库中执行此操作,例如pandas?

我现有的解决方案是初始化一个空数组C,然后在A的元素上运行for循环,如上所述索引C的公共元素.为了速度,我一直在编写和编译cython中的for循环.但是这个特定的操作是我的代码中最大的瓶颈,在使用表格数据时,它似乎是一个非常常见的数组操作,所以我想知道是否有一个高度优化的算法已经做到了.

python optimization numpy scientific-computing pandas

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

numpy中1d到3d索引对应的有效算法

我正在尝试在 3d 单元格的常规网格和这些单元格的 1d 索引之间建立对应关系。所以我想要一种在整数(i, j, k)和整数cellnum 的三元组之间来回映射的方法。此映射的速度至关重要。

问题说明:

假设一个 3d 盒子的每个维度都被划分为num_divs 个单元格。然后,从 ( i, j, k ) 到单元格的唯一字典顺序索引的映射通过以下 numpy 索引技巧闪电般快速:

indexing_array = np.arange(num_divs**3).reshape((num_divs, num_divs, num_divs))
Run Code Online (Sandbox Code Playgroud)

例如,假设我们有以下数组存储Npts点的 x、y 和 z 单元格索引

Npts = 1e6
xidx = np.random.random_integers(0, num_divs-1, Npts)
yidx = np.random.random_integers(0, num_divs-1, Npts)
zidx = np.random.random_integers(0, num_divs-1, Npts)
Run Code Online (Sandbox Code Playgroud)

存储每个三元组的cellnum的数组可以通过以下方式非常有效地计算:

output_cellnum_array = indexing_array[xidx, yidx, zidx]
Run Code Online (Sandbox Code Playgroud)

所述output_cellnum_array是一个一维阵列NPTS点。每个值都是一个整数,存储每个 ( i, j, k ) 三元组的字典顺序。上面一行在我的笔记本电脑上只需要 40 毫秒,这是我对以下问题的目标基准: …

python arrays algorithm performance numpy

2
推荐指数
1
解决办法
819
查看次数

花哨的索引一个 numpy 矩阵:每行一个元素

我有一个形状为 (m, n) 的二维 numpy 数组、矩阵。我的实际用例有 m ~ 1e5 和 n ~ 100,但为了有一个简单的最小示例:

matrix = np.arange(5*3).reshape((5, 3))
Run Code Online (Sandbox Code Playgroud)

我有一个整数索引数组 idx,形状为 (m, ),每个条目都在 [0, n) 之间。此数组指定应从matrix 的每一行中选择哪一列。

idx = np.array([2, 0, 2, 1, 1])
Run Code Online (Sandbox Code Playgroud)

所以,我试图从第 0 行选择第 2 列,从第 1 行选择第 0 列,从第 2 行选择第 2 列,从第 1 行选择第 1 列,从第 4 行选择第 1 列。因此最终答案应该是:

correct_result = np.array((2, 3, 8, 10, 13))
Run Code Online (Sandbox Code Playgroud)

我已经尝试了以下,这是直观的,但不正确:

incorrect_result = matrix[:, idx]
Run Code Online (Sandbox Code Playgroud)

上面的语法所做的是将 idx 逐行应用为花哨的索引数组,从而产生另一个形状为 (m, n) 的矩阵,这不是我想要的。

这种类型的花式索引的正确语法是什么?

python arrays numpy matrix scientific-computing

2
推荐指数
1
解决办法
665
查看次数

计算numpy ndarrays序列的外部乘积

我有一个3D点p列表,存储在形状为(N,3)的ndarray中。我想自己计算每个3d点的外部乘积:

N = int(1e4)
p = np.random.random((N, 3))
result = np.zeros((N, 3, 3))
for i in range(N):
    result[i, :, :] = np.outer(p[i, :], p[i, :])
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以计算这种外部乘积而无需任何python级循环?问题是np.outer不支持任何axis参数。

python performance numpy matrix scientific-computing

2
推荐指数
1
解决办法
631
查看次数

如果向用户定义的类传递了形状不正确的数组,则使用 python 引发异常

我正在编写一个传递数组的类。我想引发异常,除非该数组的长度正确。我更愿意使用 python 的“try...except”特性来完成这个,如果传递了一个不正确长度的数组,程序就会退出。如何实现这种行为?

这似乎是为“isinstance”设计的,但我不知道如何要求传递的数组是特定形状的 ndarray。

python arrays numpy

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

使用变量关键字作为可选参数名称与python argparse

我正在使用argparse作为我正在编写的python脚本.该脚本的目的是处理存储表格数据的大型ascii文件.该脚本只为我编写的类提供了一个方便的前端,允许在表格数据上进行任意数量的即时剪切.在类中,用户可以传入一个变量名关键字参数,其中包含绑定到变量的两元素元组.元组定义任何列的下限和上限,其名称对应于variable-name关键字.例如:

reader = AsciiFileReducer(fname, mass = (100, float("inf")), spin = (0.5, 1))
Run Code Online (Sandbox Code Playgroud)

然后,此读取器实例将忽略输入fname的所有行,但质量> 1000.5 <spin <1的那些行除外.输入fname可能有许多其他列,但只有质量旋转会对它们进行切割.

我希望我写的脚本保留此功能,但我不知道如何允许使用argparse.add_argument添加带有变量名称的参数.我的类允许任意数量的可选参数,每个参数都有未指定的名称,其中为名称选择的字符串本身就是有意义的.python的**kwargs特性使这成为可能.argparse有可能吗?

python argparse

0
推荐指数
1
解决办法
1290
查看次数

使用scipy erfinv绘制高斯随机变量

我想绘制npts随机变量,以高斯分布,均值μ和色散sigma.我知道如何在Numpy中做到这一点:

x = np.random.normal(loc=mu, scale=sigma, size=npts)
print(np.std(x), np.mean(x))
0.1998, 0.3997
Run Code Online (Sandbox Code Playgroud)

这也应该可以通过逆变换使用scipy.special.erfinv,从均匀分布开始:

u = np.random.uniform(0, 1, npts)
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何正确缩放比例.有没有人这样做过?

python random numpy scientific-computing scipy

0
推荐指数
1
解决办法
371
查看次数