我遇到了一些奇怪的错误,经过多次搜索后,这些错误似乎(可能)来自我的数据在某些情况下不被视为数字。这似乎是因为我使用了 Float64 dtype (我认为这是我应该做的)。
太长了;Float64 和 float64 有什么区别?为什么使用 Float64 数据会破坏很多东西,例如pd.interpolate?Float64 存在的目的是什么?
例子:
import pandas as pd
import numpy as np
TESTDATA = u"""\
val1, val2, val3
1.0, 2.0, 3.0
4.0, 5.0, 6.0
7.0, 8.0, 9.0
10.0, NaN, 12.0
13.0, 14.0, 15.0
"""
df = pd.read_csv(StringIO(TESTDATA), sep=r",\s*", engine='python', dtype=pd.Floa
t64Dtype())
print(df)
print()
print(df.dtypes)
Run Code Online (Sandbox Code Playgroud)
这输出:
val1 val2 val3
0 1.0 2.0 3.0
1 4.0 5.0 6.0
2 7.0 8.0 9.0
3 10.0 <NA> 12.0
4 13.0 14.0 15.0
val1 …Run Code Online (Sandbox Code Playgroud) 我正在用OpenCV读取图像,并尝试用numpy做一些事情(旋转90度).imshow从matplotlib 查看结果,这一切似乎都很好 - 图像旋转.但是,我不能在新图像上使用OpenCV的绘图方法.在以下代码中(我在sagemath云工作表中运行此代码):
%python
import cv2
import matplotlib.pyplot as plt
import numpy as np
import os, sys
image = np.array( cv2.imread('imagename.png') )
plt.imshow(image,cmap='gray')
image = np.array(np.rot90(image,3) ) # put it right side up
plt.imshow(image,cmap='gray')
cv2.rectangle(image,(0,0),(100,100),(255,0,0),2)
plt.imshow(image,cmap='gray')
Run Code Online (Sandbox Code Playgroud)
我在cv2.rectangle()命令上收到以下错误:
TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)
Run Code Online (Sandbox Code Playgroud)
如果我np.array(np.rot90(image,4) )改用(即旋转360),错误就会消失.因此,维度的变化似乎搞砸了.OpenCV是否在内部存储了我需要更新的维度或其他内容?
编辑:解决问题image = image.copy()后添加rot90().请参阅下面的rayryeng的答案.
我想将2d数据绘制为图像,并沿着x轴和y轴在下方和侧面显示轮廓图。这是一种非常常见的显示数据的方法,因此可能有一种更简单的方法来显示此数据。我想找到一种最简单,最可靠的方法,可以正确地执行此操作,并且不使用matplotlib之外的任何方法(尽管我会对了解其他可能特别相关的软件包感兴趣)。特别是,如果数据的形状(长宽比)发生变化,则该方法应该在不进行任何更改的情况下工作。
我的主要问题是使侧面图正确缩放,以便其边界与主要图匹配。
示例代码:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# generate grid and test data
x, y = np.linspace(-3,3,300), np.linspace(-1,1,100)
X, Y = np.meshgrid(x,y)
def f(x,y) :
return np.exp(-(x**2/4+y**2)/.2)*np.cos((x**2+y**2)*10)**2
data = f(X,Y)
# 2d image plot with profiles
h, w = data.shape
gs = gridspec.GridSpec(2, 2,width_ratios=[w,w*.2], height_ratios=[h,h*.2])
ax = [plt.subplot(gs[0]),plt.subplot(gs[1]),plt.subplot(gs[2])]
bounds = [x.min(),x.max(),y.min(),y.max()]
ax[0].imshow(data, cmap='gray', extent = bounds, origin='lower')
ax[1].plot(data[:,w/2],Y[:,w/2],'.',data[:,w/2],Y[:,w/2])
ax[1].axis([data[:,w/2].max(), data[:,w/2].min(), Y.min(), Y.max()])
ax[2].plot(X[h/2,:],data[h/2,:],'.',X[h/2,:],data[h/2,:])
plt.show()
Run Code Online (Sandbox Code Playgroud)
从下面的输出中可以看到,事物向右缩放的方式与边界没有正确匹配。
部分解决方案:
1)手动播放图形尺寸以找到正确的长宽比,以便正确显示(可以自动使用图像比例+填充+所使用的宽度比例吗?)。当已经有太多的包装选项被认为可以自动处理这些事情时,它似乎很俗气。编辑: plt.gcf().set_figheight(f.get_figwidth()*h/w)如果不更改填充似乎工作。
2)添加ax[0].set_aspect('auto') …
我想制作一个流线图,当它们靠得太近时不会停止。我宁愿在两个方向上计算每个流线,直到它碰到窗口的边缘。结果是在某些区域它们会混在一起。但这就是我想要的。
我无论如何要在matplotlib中做到这一点?如果没有,我可以使用另一个工具来与 python/numpy 交互吗?
import numpy as np
import matplotlib.pyplot as plt
Y,X = np.mgrid[-10:10:.01, -10:10:.01]
U, V = Y**2, X**2
plt.streamplot(X,Y, U,V, density=1)
plt.show(False)
Run Code Online (Sandbox Code Playgroud)
我有一个 3D 曲面图。我还想在 2D 中绘制此图的切片,并以某种方式在 3D 图中指示切片的来源(例如为切片上的点着色以“突出显示”切片,或绘制相交平面或其他东西)。
下面是一个示例,我只是将特定行设置为 0,以便我可以看到切片在 3D 图中的位置。
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
# Grid and test function
N = 29;
x,y = np.linspace(-1,1, N*2), np.linspace(-1,1, N)
X,Y = np.meshgrid(x,y)
F = lambda X,Y : np.sin(10*X)/(1+5*(X**2+Y**2))
Z = F(X,Y)
# 3D Surface plot
plt.figure(figsize = (5,6))
Z2 = Z.copy(); Z2[10,:] = 0 # <----- Replace this code
ax = plt.subplot(211, projection='3d')
ax.plot_surface(X,Y,Z2)
# 2D Plot of slice of 3D plot …Run Code Online (Sandbox Code Playgroud)