对于Python初学者来说,我有一个艰巨的任务,我需要从用LaTex编写的源文件导入一个表。我想我会使用表的名称作为标识符,然后从表的开头到结尾逐行写入数组。完成这项工作的“自然”方式是什么?
我正在学习如何使用 Anaconda 中的 Python 模块来使用 netCDF4。我正在尝试将值附加到我创建的两个变量time和field:
from netCDF4 import Dataset
import numpy as np
root_grp = Dataset('py_netcdf4.nc', 'w', format='NETCDF4')
root_grp.description = 'Example simulation data'
ndim = 128 # Size of the matrix ndim*ndim
xdimension = 0.75
ydimension = 0.75
# dimensions
root_grp.createDimension('time', None)
root_grp.createDimension('x', ndim)
root_grp.createDimension('y', ndim)
# variables
time = root_grp.createVariable('time', 'f8', ('time',))
x = root_grp.createVariable('x', 'f4', ('x',))
y = root_grp.createVariable('y', 'f4', ('y',))
field = root_grp.createVariable('field', 'f8', ('time', 'x', 'y',))
# data
x_range = np.linspace(0, …Run Code Online (Sandbox Code Playgroud) 我有两个数组的绘图数据以未分类的方式存储,因此绘图不连续地从一个地方跳到另一个地方:
我试过一个在2D数组中找到最近点的例子:
import numpy as np
def distance(pt_1, pt_2):
pt_1 = np.array((pt_1[0], pt_1[1]))
pt_2 = np.array((pt_2[0], pt_2[1]))
return np.linalg.norm(pt_1-pt_2)
def closest_node(node, nodes):
nodes = np.asarray(nodes)
dist_2 = np.sum((nodes - node)**2, axis=1)
return np.argmin(dist_2)
a = []
for x in range(50000):
a.append((np.random.randint(0,1000),np.random.randint(0,1000)))
some_pt = (1, 2)
closest_node(some_pt, a)
Run Code Online (Sandbox Code Playgroud)
我能以某种方式使用它来"清理"我的数据吗?(在上面的代码中,a可以是我的数据)
我计算的示例数据是:
array([[ 2.08937872e+001, 1.99020033e+001, 2.28260611e+001,
6.27711094e+000, 3.30392288e+000, 1.30312878e+001,
8.80768833e+000, 1.31238275e+001, 1.57400130e+001,
5.00278061e+000, 1.70752624e+001, 1.79131456e+001,
1.50746185e+001, 2.50095731e+001, 2.15895974e+001,
1.23237801e+001, 1.14860312e+001, 1.44268222e+001,
6.37680265e+000, 7.81485403e+000],
[ -1.19702178e-001, -1.14050879e-001, -1.29711421e-001,
8.32977493e-001, 7.27437322e-001, …Run Code Online (Sandbox Code Playgroud) 我以滑块小部件为例,并尝试将其插入到一个类中。滑块可以正常工作,但由于某种原因,当该方法位于类中时,Button 和 RadioButtons 没有反应:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
class test(object):
def __init__(self):
fig, ax = plt.subplots()
plt.subplots_adjust(left=0.25, bottom=0.25)
t = np.arange(0.0, 1.0, 0.001)
a0 = 5
f0 = 3
s = a0*np.sin(2*np.pi*f0*t)
l, = plt.plot(t, s, lw=2, color='red')
plt.axis([0, 1, -10, 10])
axcolor = 'lightgoldenrodyellow'
axfreq = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor=axcolor)
axamp = plt.axes([0.25, 0.15, 0.65, 0.03], facecolor=axcolor)
sfreq = Slider(axfreq, 'Freq', 0.1, 30.0, valinit=f0)
samp = …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个大小为 6*n 的数组,这样对于数组中每批 6 个单元格,我将具有以下整数值:
a = [n-2, n-1,n,n,n+1,n+1,n+2,n+3]
Run Code Online (Sandbox Code Playgroud)
我能想到的平庸的方法是使用这个例程:
a = []
for i in xrange(n):
np.append(a,[n-2, n-1,n,n,n+1,n+1,n+2,n+3])
Run Code Online (Sandbox Code Playgroud)
但有没有一种更智能、更快速的方法呢?
我正在从AUTO数字延续包中获取输出,并且需要过滤掉具有负值变量的结果,因为它们是非物理的.所以,如果我有,例如:
>>> a = np.array([[0,1,2,3,4],[-1,-0.5,0,0.5,1],[-3,-4,-5,0.1,0.2]])
Run Code Online (Sandbox Code Playgroud)
我想留下:
>>> b
array([[ 3. , 4. ],
[ 0.5, 1. ],
[ 0.1, 0.2]])
Run Code Online (Sandbox Code Playgroud)
但是当我尝试时,numpy.where我得到:
>>> b = a[:,(np.where(a[1]>=0) and np.where(a[2]>=0))]
>>> b
array([[[ 3. , 4. ]],
[[ 0.5, 1. ]],
[[ 0.1, 0.2]]])
>>> b.shape
(3, 1, 2)
Run Code Online (Sandbox Code Playgroud)
也就是说,它会向阵列添加另一个不需要的轴.我究竟做错了什么?
我正在学习python-igraph,并且难以处理分为组件(在它们之间没有连接)的图。当我在该图上应用一种聚类算法时,它似乎无法正常工作,因此我需要将算法分别应用于每个子图(组件)。因此,为了保持顶点的标识,我想添加一个顶点属性,该属性在原始图中为我提供ID号。我的图是根据加权邻接矩阵构造的:
import numpy as np
import igraph
def symmetrize(a):
return a + a.T - 2*np.diag(a.diagonal())
A = symmetrize(np.random.random((100,100)))
G = igraph.Graph.Adjacency(A.tolist(),attr="weight",mode="UPPER")
Run Code Online (Sandbox Code Playgroud)
我看到应该有一种添加顶点属性的方法,但是我不知道如何使用它。
我对 Numba 的工作有点陌生,但我已经了解了它的要点。我想知道是否有更高级的技巧可以使四个嵌套for循环比我现在的速度更快。特别是,我需要计算以下积分:
其中B是二维数组,S0和E是某些参数。我的代码如下:
import numpy as np
from numba import njit, double
def calc_gb_gauss_2d(b,s0,e,dx):
n,m=b.shape
norm = 1.0/(2*np.pi*s0**2)
gb = np.zeros((n,m))
for i in range(n):
for j in range(m):
for ii in range(n):
for jj in range(m):
gb[i,j]+=np.exp(-(((i-ii)*dx)**2+((j-jj)*dx)**2)/(2.0*(s0*(1.0+e*b[i,j]))**2))
gb[i,j]*=norm
return gb
calc_gb_gauss_2d_nb = njit(double[:, :](double[:, :],double,double,double))(calc_gb_gauss_2d)
Run Code Online (Sandbox Code Playgroud)
对于大小为输入的数组,256x256计算速度为:
In [4]: a=random.random((256,256))
In [5]: %timeit calc_gb_gauss_2d_nb(a,0.1,1.0,0.5)
The slowest run took 8.46 times longer than the fastest. This could mean that an intermediate result is being cached.
1 …Run Code Online (Sandbox Code Playgroud) 我有一个numpy二维数组,其值代表节点之间的边的权重。该矩阵是对称的,我取对角线为零。我没有找到如何将此矩阵转换为 igraph 图形对象的示例。我尝试过以下方法,但它不起作用:
import numpy as np
import igraph
def symmetrize(a):
return a + a.T - 2*np.diag(a.diagonal())
A = symmetrize(np.random.random((100,100)))
G = igraph.Graph.Adjacency(A.tolist())
Run Code Online (Sandbox Code Playgroud) 我有Sympy解算器的这个解决方案列表:
In [49]: sol
Out[49]:
[-1.20258344291917 - 0.e-23*I,
-0.835217129314554 + 0.e-23*I,
0.497800572233726 - 0.e-21*I]
In [50]: type(sol)
Out[50]: list
In [51]: type(sol[0])
Out[51]: sympy.core.add.Add
Run Code Online (Sandbox Code Playgroud)
如何将此列表转换为具有正常复杂值的单元格的numpy对象?