我有一个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_types将xlist转换为结构化的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?
该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)
是否有类似的简单方法来计算逆 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)
是否存在这样的函数kde_gaussian
?或者从已经实现的方法构造这样的函数是否很简单?
我的代码中的速度瓶颈是两个数组x和y的元素循环的两倍.用于提高性能的标准hpc技巧是以块的形式进行循环,以便可以最小化缓存未命中.我正在尝试使用python生成器来进行分块,但是需要在外部for循环中不断重新创建耗尽的生成器,这会杀死我的运行时.
题:
是否有更智能的算法来构造适当的生成器来执行chunked double-for循环?
具体插图:
我将创建两个虚拟数组,x和y.我会简短地说明它们,但实际上这些是带有~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) 下面的结果是我有一个令人尴尬的并行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
我正在编写一个 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 算法的 …
我正在制作一个 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中寻找一个优化的工具来执行一个数组操作任务,我发现自己一遍又一遍地做.如果该工具已经存在,例如在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循环.但是这个特定的操作是我的代码中最大的瓶颈,在使用表格数据时,它似乎是一个非常常见的数组操作,所以我想知道是否有一个高度优化的算法已经做到了.
我正在尝试在 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 毫秒,这是我对以下问题的目标基准: …
我有一个形状为 (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) 的矩阵,这不是我想要的。
这种类型的花式索引的正确语法是什么?
我有一个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 的“try...except”特性来完成这个,如果传递了一个不正确长度的数组,程序就会退出。如何实现这种行为?
这似乎是为“isinstance”设计的,但我不知道如何要求传递的数组是特定形状的 ndarray。
我正在使用argparse作为我正在编写的python脚本.该脚本的目的是处理存储表格数据的大型ascii文件.该脚本只为我编写的类提供了一个方便的前端,允许在表格数据上进行任意数量的即时剪切.在类中,用户可以传入一个变量名关键字参数,其中包含绑定到变量的两元素元组.元组定义任何列的下限和上限,其名称对应于variable-name关键字.例如:
reader = AsciiFileReducer(fname, mass = (100, float("inf")), spin = (0.5, 1))
Run Code Online (Sandbox Code Playgroud)
然后,此读取器实例将忽略输入fname的所有行,但质量> 100且0.5 <spin <1的那些行除外.输入fname可能有许多其他列,但只有质量和旋转会对它们进行切割.
我希望我写的脚本保留此功能,但我不知道如何允许使用argparse.add_argument添加带有变量名称的参数.我的类允许任意数量的可选参数,每个参数都有未指定的名称,其中为名称选择的字符串本身就是有意义的.python的**kwargs特性使这成为可能.argparse有可能吗?
我想绘制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 ×13
numpy ×11
performance ×5
arrays ×4
cython ×2
matrix ×2
scipy ×2
algorithm ×1
argparse ×1
generator ×1
matplotlib ×1
optimization ×1
pandas ×1
plot ×1
random ×1