我想从 2D Numpy 数组的索引中采样,考虑到每个索引都由该数组内的数字加权。numpy.random.choice然而,我知道它的方式不返回索引,而是返回数字本身。有什么有效的方法吗?
这是我的代码:
import numpy as np
A=np.arange(1,10).reshape(3,3)
A_flat=A.flatten()
d=np.random.choice(A_flat,size=10,p=A_flat/float(np.sum(A_flat)))
print d
Run Code Online (Sandbox Code Playgroud) 所以我使用matplotlib Cookbook生成以下灰度高斯轮廓:
import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
import numpy.ma as ma
from numpy.random import uniform, seed
from matplotlib import cm
def gauss(x,y,Sigma,mu):
X=np.vstack((x,y)).T
mat_multi=np.dot((X-mu[None,...]).dot(np.linalg.inv(Sigma)),(X-mu[None,...]).T)
return np.diag(np.exp(-1*(mat_multi)))
def plot_countour(x,y,z):
# define grid.
xi = np.linspace(-2.1,2.1,100)
yi = np.linspace(-2.1,2.1,100)
## grid the data.
zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')
# contour the gridded data, plotting dots at the randomly spaced data points.
CS = plt.contour(xi,yi,zi,6,linewidths=0.5,colors='k')
#CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet)
CS = plt.contourf(xi,yi,zi,6,cmap=cm.Greys_r) …Run Code Online (Sandbox Code Playgroud) 我试图在这里和这里主要使用代码colorbar为两个添加一个。matshow
我的代码如下,但是问题是颜色条会缓和右侧图的大小。我该如何预防?
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
# Generate some data that where each slice has a different range
# (The overall range is from 0 to 2)
data = np.random.random((2,10,10))
data *= np.array([1.5, 2.0])[:,None,None]
# Plot each slice as an independent subplot
fig, axes = plt.subplots(nrows=1, ncols=2)
for dat, ax in zip(data, axes.flat):
# The vmin and vmax arguments specify the color limits
im = …Run Code Online (Sandbox Code Playgroud) 如何通过修复它的参数来创建比原始维度更小的维度的函数:
例如,我想用sum函数制作后继函数,如下所示:
def add(x,y):
return x+y
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找这样的东西:
g = f(〜,1),它将是后继函数,即g(x)= x + 1.
python function bayesian-networks argument-passing belief-propagation
是否有任何内置的numpy函数可以得到:
a=np.asarray([[[1,2],[3,4]],[[1,2],[3,4]]])
Run Code Online (Sandbox Code Playgroud)
并会回来:
b=[[1,2],[3,4],[1,2],[3,4]]
Run Code Online (Sandbox Code Playgroud)
?像一层扁平化的东西.
PS我正在寻找一个矢量化选项,否则这个哑代码可用:
flat1D(a):
b=np.array([])
for item in a:
b=np.append(b,item)
return b
Run Code Online (Sandbox Code Playgroud) 我有一个矩阵说a.我需要得到它的一个子矩阵,基本上它的索引来自主矩阵索引的映射(这个映射不一定是1-1).我有以下代码来生成子矩阵,这里映射被认为是sum.
import numpy as np
def transform(A):
B=np.zeros(A.flatten().shape[0])
for i in range(A.flatten().shape[0]):
multi_idx=np.unravel_index(i,A.shape)
B[np.sum(multi_idx)]=A[multi_idx] #the mapping applied on the indices: B[np.sum(multi_idx)]
return B
A=np.arange(27).reshape([3,3,3])
print A
print transform(A)
Run Code Online (Sandbox Code Playgroud)
随着输出:
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]
[24 25 26]]]
[ 0. 9. 18. 21. 24. 25. 26. 0. 0. 0. 0. 0. 0. 0. 0. …Run Code Online (Sandbox Code Playgroud) 根据爱因斯坦求和来编写求和的正确方法对我来说是一个难题,所以我想在我的代码中尝试它.我在一些案例中取得了成功,但大多数都是经过反复试验.
现在有一个我无法弄清楚的案例.首先,一个基本问题.对于两个矩阵A和B是Nx1和 1xN分别,AB是NxN但BA是1x1.当我想NxN用np.einsum我可以做的计算案例时:
import numpy as np
a = np.asarray([[1,2]])
b = np.asarray([[2,3]])
print np.einsum('ij,ji->ij', a, b)
Run Code Online (Sandbox Code Playgroud)
最后一个数组是2x2.然而
a = np.asarray([[1,2]])
b = np.asarray([[2,3]])
print np.einsum('ij,ij->ij', a, b)
Run Code Online (Sandbox Code Playgroud)
返回一个1x2数组.我不太明白为什么这不能给出正确的结果.例如,对于上述案例numpy的指南说,箭头可用于强制求和或阻止它发生.但这对我来说似乎很模糊; 在上面的例子中,我不明白numpy如何根据索引的顺序(显然发生变化)决定输出数组的最终大小.
形式上我知道如下:当箭头右侧没有任何内容时,可以用数学方式将求和写为$\sum\limits_ {i = 0} ^ {N}\sum\limits_ {j = 0} ^ { M} A_ {ij} B_ {ij} $ for np.einsum('ij,ij',A,B),但是当有箭头时,我无法用正式的数学表达式来解释它.
我正在寻找将列的范数作为矩阵中的向量计算的最佳方法。我现在的代码是这样的,但是我确信它可以变得更好(也许是numpy?):
import numpy as np
def norm(a):
ret=np.zeros(a.shape[1])
for i in range(a.shape[1]):
ret[i]=np.linalg.norm(a[:,i])
return ret
a=np.array([[1,3],[2,4]])
print norm(a)
Run Code Online (Sandbox Code Playgroud)
哪个返回:
[ 2.23606798 5. ]
Run Code Online (Sandbox Code Playgroud)
谢谢。
这是这里的代码示例:
函数参数赋值中的相等意味着什么?像N=20000这儿?N这和简单地作为论证有什么区别?导入随机数、数学
def gibbs(N=20000,thin=500):
x=0
y=0
samples = []
for i in range(N):
for j in range(thin):
x=random.gammavariate(3,1.0/(y*y+4))
y=random.gauss(1.0/(x+1),1.0/math.sqrt(x+1))
samples.append((x,y))
return samples
smp = gibbs()
Run Code Online (Sandbox Code Playgroud) 据我了解,类属性在某种意义上可以用作 Python 的静态变量。我有一个类,我想在第一次运行期间设置这个静态变量__init__(),即在创建第一个对象时并保持这样。不是每次都更新。我应该怎么做?即使设置标志也无济于事。
class A():
foo=None
foo_set_flag=False
def __init__(self,arg_foo):
if not self.foo_set_flag:
self.foo=arg_foo
foo_set_flag=True
a=A(12)
b=A(13)
print a.foo
print b.foo
Run Code Online (Sandbox Code Playgroud)
这使:
12
13
Run Code Online (Sandbox Code Playgroud)
当然我期待
12
12
Run Code Online (Sandbox Code Playgroud)