小编Gab*_*iel的帖子

使用元素取幂加速嵌套for循环

我正在研究一个大型代码,我发现自己需要加速它的特定部分.我创建了MWE如下所示:

import numpy as np
import time

def random_data(N):
    # Generate some random data.
    return np.random.uniform(0., 10., N).tolist()

# Lists that contain all the data.
list1 = [random_data(10) for _ in range(1000)]
list2 = [random_data(1000), random_data(1000)]

# Start taking the time.
tik = time.time()

list4 = []
# Loop through all elements in list1.
for elem in list1:

    list3 = []
    # Loop through elements in list2.
    for elem2 in zip(*list2):

        A = np.exp(-0.5*((elem[0]-elem2[0])/elem[3])**2)
        B = np.exp(-0.5*((elem[1]-elem2[1])/elem[3])**2)
        list3.append(A*B) …
Run Code Online (Sandbox Code Playgroud)

python performance numpy scipy

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

轴中科学记数法的字体大小不一致

我正在尝试绘制一个 x 轴将以科学记数法显示的图。我找到的方法是使用该ticklabel_format函数。不幸的是,这不尊重我分配给轴中显示的数字的字体大小,请参见下图:

在此处输入图片说明

即使我设置了相同的标签大小,1e-121e4也以不同的字体大小显示。

我怎么能解决这个问题?(AMWE在下面)

import matplotlib.pyplot as plt
import numpy as np

t = np.arange(0.0, 10000.0, 10.)
s = np.sin(np.pi*t)*np.exp(-t*0.0001)

fig, ax = plt.subplots()

ax.tick_params(axis='both', which='major', labelsize=7)
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0), labelsize=7)
plt.plot(t,s)

plt.show()
Run Code Online (Sandbox Code Playgroud)

python fonts matplotlib font-size

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

无法再现使用星座获得的源之间的距离值

我有两个来源与赤道坐标(ra, dec)(ra_0, dec_0)位于距离rr_0,我需要计算它们之间的3D距离.

我使用两种方法,据我所知,应该给出相同的结果,但不是.

第一种方法是应用astropyseparation_3d函数.第二种方法是使用表达式给出两个具有球面坐标的源之间的距离:

在此输入图像描述

如图所示这里.

在下面的MCVE中,返回的值是:

91.3427173002 pc
93.8470493776 pc
Run Code Online (Sandbox Code Playgroud)

这两个值不应该相等吗?

MCVE:

from astropy.coordinates import SkyCoord
from astropy import units as u
import numpy as np

# Define some coordinates and distances for the sources.
c1 = SkyCoord(ra=9.7*u.degree, dec=-50.6*u.degree, distance=1500.3*u.pc)
c2 = SkyCoord(ra=7.5*u.degree, dec=-47.6*u.degree, distance=1470.2*u.pc)

# Obtain astropy's distance between c1 & c2 coords.
print c1.separation_3d(c2)

# Obtain distance between c1 & …
Run Code Online (Sandbox Code Playgroud)

python coordinates astropy

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

适合3D中的一组点的平面:scipy.optimize.minimize vs scipy.linalg.lstsq

给定3D中的一组点,一般问题是以下列形式找到a, b, c平面方程的系数:

z = a*x + b*y + c
Run Code Online (Sandbox Code Playgroud)

这样得到的平面最适合那组点.

  1. 这个SO答案中,函数scipy.optimize.minimize用于解决此问题.

    它依赖于系数的初始猜测,并最小化误差函数,该函数将每个点与平面表面的距离相加.

  2. 此代码中(基于此其他SO答案),scipy.linalg.lstsq函数用于解决相同的问题(当限制为一阶多项式时).

    C在等式中求解z = A*C,其中点集Ax,y坐标的连接是集合zz坐标,并且Ca,b,c系数.

    与上述方法中的代码不同,这个代码似乎不需要对平面系数进行初始猜测.

由于该 minimize函数需要初始猜测,这意味着它可能会或可能不会收敛到最优解(取决于猜测的好坏程度).第二种方法是否有类似的警告,或者它会返回一个始终精确的解决方案吗?

python mathematical-optimization scipy

6
推荐指数
2
解决办法
7732
查看次数

计算数组中非 nan 值的数量

我有一个 float/nan 值列表,如下所示:

a = [(9.62, np.nan, 0.063), (np.nan, np.nan, np.nan), (np.nan, 0.34, np.nan), (9.50, 2.65, 5.85), (np.nan, np.nan, np.nan), (8.9423173497260166e-06, np.nan, np.nan), (np.nan, np.nan, np.nan), (10.53906499271581, np.nan, 3.4981897643207153e-08), (27.945228892337656, np.nan, np.nan), (np.nan, np.nan, np.nan), (0.00015676098048248007, 428.53224664333368, 15.597030989617416), (3.219339103511719e-08, np.nan, np.nan), (351.3486881626871, 118.79412856376891, 96.925698744436318), (np.nan, np.nan, np.nan), (np.nan, np.nan, np.nan), (0.038185812702743384, 0.011979539923543838, 1.4161404311887908e-05), (6.5891883211951452, np.nan, np.nan), (np.nan, np.nan, np.nan), (np.nan, np.nan, np.nan), (np.nan, np.nan, np.nan), (0.01992113565158183, 1.0858887135978378e-08, 6.949483102803238e-08), (np.nan, np.nan, np.nan), (0.0053471054969118897, 32.364223190908589, 0.29950485126829518), (0.022687094833899225, np.nan, 3.3927513616780456e-05), (0.0065459356887503, 5.0304474154655309e-06, 6.1755309734841293e-06), …
Run Code Online (Sandbox Code Playgroud)

python arrays

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

scipy.interpolate.Rbf 和 scipy.interpolate.griddata 之间的妥协?

我需要生成一个给定一些非结构化(x, y)坐标的 2D 密度图,以及一个z作为分配给每个点的权重的值。

我可以使用scipy.interpolate.Rbfscipy.interpolate.griddata将值插入网格(见下面的代码)。第一个非常准确但非常慢,而第二个要快得多但明显不太准确。

请参见下图,Rfb左侧和griddata右侧的位置:

在此处输入图片说明

有没有办法在这两个功能之间妥协?会产生与Rfb函数更相似的结果但速度与griddata函数更相似的东西?

# Data
N = 1000
x, y, z = np.random.uniform(0.0005, 0.03, N),\
    np.random.uniform(6., 10., N), np.random.uniform(1., 10., N)
xmin, xmax, ymin, ymax = min(x), max(x), min(y), max(y)

# Set up a regular grid of interpolation points
xi, yi = np.linspace(xmin, xmax, 200), np.linspace(ymin, ymax, 200)
xi, yi = np.meshgrid(xi, yi)
# Normalize data …
Run Code Online (Sandbox Code Playgroud)

python interpolation scipy

6
推荐指数
0
解决办法
842
查看次数

3D 数据的最佳拟合平面:两种不同方法的不同结果

虽然有很多关于如何使飞机最适合 SO 上的某些 3D 数据的问题,但我找不到这个问题的答案。

给定N(x, y, z) 点,我需要最适合的平面

a*x + b*y + c*z + d = 0
Run Code Online (Sandbox Code Playgroud)

通过a, b, c, d最小化从点到平面的正交距离的平均值的系数来定义。点平面正交距离(对于给(x0, y0, z0)定点)定义为

d = |a*x0 + b*y0 + c*z0 + d|/sqrt(a^2 + b^2 + c^2)
Run Code Online (Sandbox Code Playgroud)

我设置了两种方法(下面的代码):

据我了解,SVD 方法应该通过分析最小化正交距离来产生精确的最佳拟合平面。相反,我发现 BH 方法比所谓的精确 SVD 方法给出了更好的结果,即使对于少量的 BH 运行也是如此。

“更好”是指BH 方法的最终平均正交距离值小于SVD 方法。

我在这里缺少什么?


import numpy as np
import …
Run Code Online (Sandbox Code Playgroud)

python 3d scipy svd

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

确定一个多边形是否包含另一个

(就我的目的而言,"多边形"不包括自相交多边形或带孔的多边形 - 只是简单(凹或凸)多边形.)

我找到了针对这个问题的各种建议,主要基于以下几点:

如果Polygon1的边缘与Polygon2的边缘之间没有交叉点,并且Polygon2的至少一个顶点是"内部"Polygon1,则Polygon1包含Polygon2.

(例如,请参阅此处接受的答案)

然而,魔鬼在细节:

  • "内部"Polygon1是否包含"Polygon1"的边缘?显然它必须,否则在图F中(参见下面链接的图像)Polygon2(红色)在Polygon1(蓝色)内部没有顶点,因此在应该通过时不能通过上述测试.

  • 两条边的"交点"是否包含一条边(即顶点)末端的点?如果"是",则下面的图A和E具有交叉点,因此当它们通过时测试失败.但如果"不",则图B,C和D没有交叉点,因此当它们失败时通过测试.

选择图表来说明上述内容. (NB图A,B和C在Polygon1的边缘上具有Polygon2的顶点,图D和E反之亦然.)

我无法确定一个条件来测试这些不同情况之间的区别.我会感激任何指针?

algorithm geometry polygon

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

Kurtosis,条形图的偏斜? - Python

什么是确定python中条形图的偏斜/峰度的有效方法?考虑到条形图没有分箱(与直方图不同),这个问题没有多大意义,但我想要做的是确定图形高度与距离的对称性(而不是频率与分档).换句话说,给定沿距离(x)测量的高度(y)值,即

y = [6.18, 10.23, 33.15, 55.25, 84.19, 91.09, 106.6, 105.63, 114.26, 134.24, 137.44, 144.61, 143.14, 150.73, 156.44, 155.71, 145.88, 120.77, 99.81, 85.81, 55.81, 49.81, 37.81, 25.81, 5.81]
x = [0.03, 0.08, 0.14, 0.2, 0.25, 0.31, 0.36, 0.42, 0.48, 0.53, 0.59, 0.64, 0.7, 0.76, 0.81, 0.87, 0.92, 0.98, 1.04, 1.09, 1.15, 1.2, 1.26, 1.32, 1.37]
Run Code Online (Sandbox Code Playgroud)

在距离(x)上测量的高度(y)分布(偏度)和峰值(峰度)的对称性是多少?偏度/峰度是否适合用于确定实际值的正态分布?或者scipy/numpy是否为这种类型的测量提供类似的东西?

我可以通过以下方式实现沿距离(x)分箱的高度(y)频率值的偏斜/峰度估计

freq=list(chain(*[[x_v]*int(round(y_v)) for x_v,y_v in zip(x,y)]))
x.extend([x[-1:][0]+x[0]])          #add one extra bin edge 
hist(freq,bins=x)
ylabel("Height Frequency")
xlabel("Distance(km) Bins")
print "Skewness,","Kurtosis:",stats.describe(freq)[4:]

Skewness, Kurtosis: (-0.019354300509997705, -0.7447085398785758)
Run Code Online (Sandbox Code Playgroud)

直方图

在这种情况下,高度分布在中点距离附近是对称的(偏斜0.02)并且以扁平(-0.74峰度,即宽)分布为特征. …

python numpy scipy

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

将索引列表转换为布尔掩码的快速方法

这是一个非常简单的问题,但我还没有找到简单的答案。假设您有一个大数组,该数组的索引列表,并且您希望使用这些索引生成布尔掩码。

import numpy as np

# A large array
arr = np.random.uniform(0., 1., 500000)

# A list of indexes (much larger in real code)
idx = [89, 3455, 3, 26789]

# The boolean mask
msk = []
for _ in range(len(arr)):
    if _ in idx:
        msk.append(True)
    else:
        msk.append(False)
msk = np.array(msk)
Run Code Online (Sandbox Code Playgroud)

上面的 for 块可以工作,但对于大型idx数组来说会变慢。实现这一目标的快速方法是什么?我知道np.where() 可以反过来使用(布尔值转换为索引),它也可以在这里使用吗?

python arrays boolean numpy

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