我正在研究一个大型代码,我发现自己需要加速它的特定部分.我创建了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) 我正在尝试绘制一个 x 轴将以科学记数法显示的图。我找到的方法是使用该ticklabel_format函数。不幸的是,这不尊重我分配给轴中显示的数字的字体大小,请参见下图:

即使我设置了相同的标签大小,1e-12和1e4也以不同的字体大小显示。
我怎么能解决这个问题?(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) 我有两个来源与赤道坐标(ra, dec)和(ra_0, dec_0)位于距离r和r_0,我需要计算它们之间的3D距离.
我使用两种方法,据我所知,应该给出相同的结果,但不是.
第一种方法是应用astropy的separation_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) 给定3D中的一组点,一般问题是以下列形式找到a, b, c平面方程的系数:
z = a*x + b*y + c
Run Code Online (Sandbox Code Playgroud)
这样得到的平面最适合那组点.
在这个SO答案中,函数scipy.optimize.minimize用于解决此问题.
它依赖于系数的初始猜测,并最小化误差函数,该函数将每个点与平面表面的距离相加.
在此代码中(基于此其他SO答案),scipy.linalg.lstsq函数用于解决相同的问题(当限制为一阶多项式时).
它C在等式中求解z = A*C,其中点集A的x,y坐标的连接是集合z的z坐标,并且C是a,b,c系数.
与上述方法中的代码不同,这个代码似乎不需要对平面系数进行初始猜测.
由于该 minimize函数需要初始猜测,这意味着它可能会或可能不会收敛到最优解(取决于猜测的好坏程度).第二种方法是否有类似的警告,或者它会返回一个始终精确的解决方案吗?
我有一个 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) 我需要生成一个给定一些非结构化(x, y)坐标的 2D 密度图,以及一个z作为分配给每个点的权重的值。
我可以使用scipy.interpolate.Rbf或scipy.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) (虽然有很多关于如何使飞机最适合 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) (就我的目的而言,"多边形"不包括自相交多边形或带孔的多边形 - 只是简单(凹或凸)多边形.)
我找到了针对这个问题的各种建议,主要基于以下几点:
如果Polygon1的边缘与Polygon2的边缘之间没有交叉点,并且Polygon2的至少一个顶点是"内部"Polygon1,则Polygon1包含Polygon2.
(例如,请参阅此处接受的答案)
然而,魔鬼在细节:
"内部"Polygon1是否包含"Polygon1"的边缘?显然它必须,否则在图F中(参见下面链接的图像)Polygon2(红色)在Polygon1(蓝色)内部没有顶点,因此在应该通过时不能通过上述测试.
两条边的"交点"是否包含一条边(即顶点)末端的点?如果"是",则下面的图A和E具有交叉点,因此当它们通过时测试失败.但如果"不",则图B,C和D没有交叉点,因此当它们失败时通过测试.
(NB图A,B和C在Polygon1的边缘上具有Polygon2的顶点,图D和E反之亦然.)
我无法确定一个条件来测试这些不同情况之间的区别.我会感激任何指针?
什么是确定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峰度,即宽)分布为特征. …
这是一个非常简单的问题,但我还没有找到简单的答案。假设您有一个大数组,该数组的索引列表,并且您希望使用这些索引生成布尔掩码。
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() 可以反过来使用(布尔值转换为索引),它也可以在这里使用吗?