Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit48b6327

Browse files
authored
Merge pull request#18286 from l-johnston/issue_18077
Fix imshow to work with subclasses of ndarray.
2 parentsc5d15fc +a7bfe53 commit48b6327

File tree

2 files changed

+81
-1
lines changed

2 files changed

+81
-1
lines changed

‎lib/matplotlib/image.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0,
444444
# of over numbers.
445445
self.norm.autoscale_None(A)
446446
dv=np.float64(self.norm.vmax)-np.float64(self.norm.vmin)
447-
vmid=self.norm.vmin+dv/2
447+
vmid=np.float64(self.norm.vmin)+dv/2
448448
fact=1e7ifscaled_dtype==np.float64else1e4
449449
newmin=vmid-dv*fact
450450
ifnewmin<a_min:

‎lib/matplotlib/tests/test_image.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1124,3 +1124,83 @@ def test_exact_vmin():
11241124
@pytest.mark.flaky
11251125
deftest_https_imread_smoketest():
11261126
v=mimage.imread('https://matplotlib.org/1.5.0/_static/logo2.png')
1127+
1128+
1129+
# A basic ndarray subclass that implements a quantity
1130+
# It does not implement an entire unit system or all quantity math.
1131+
# There is just enough implemented to test handling of ndarray
1132+
# subclasses.
1133+
classQuantityND(np.ndarray):
1134+
def__new__(cls,input_array,units):
1135+
obj=np.asarray(input_array).view(cls)
1136+
obj.units=units
1137+
returnobj
1138+
1139+
def__array_finalize__(self,obj):
1140+
self.units=getattr(obj,"units",None)
1141+
1142+
def__getitem__(self,item):
1143+
units=getattr(self,"units",None)
1144+
ret=super(QuantityND,self).__getitem__(item)
1145+
ifisinstance(ret,QuantityND)orunitsisnotNone:
1146+
ret=QuantityND(ret,units)
1147+
returnret
1148+
1149+
def__array_ufunc__(self,ufunc,method,*inputs,**kwargs):
1150+
func=getattr(ufunc,method)
1151+
if"out"inkwargs:
1152+
raiseNotImplementedError
1153+
iflen(inputs)==1:
1154+
i0=inputs[0]
1155+
unit=getattr(i0,"units","dimensionless")
1156+
out_arr=func(np.asarray(i0),**kwargs)
1157+
eliflen(inputs)==2:
1158+
i0=inputs[0]
1159+
i1=inputs[1]
1160+
u0=getattr(i0,"units","dimensionless")
1161+
u1=getattr(i1,"units","dimensionless")
1162+
u0=u1ifu0isNoneelseu0
1163+
u1=u0ifu1isNoneelseu1
1164+
ifufuncin [np.add,np.subtract]:
1165+
ifu0!=u1:
1166+
raiseValueError
1167+
unit=u0
1168+
elifufunc==np.multiply:
1169+
unit=f"{u0}*{u1}"
1170+
elifufunc==np.divide:
1171+
unit=f"{u0}/({u1})"
1172+
else:
1173+
raiseNotImplementedError
1174+
out_arr=func(i0.view(np.ndarray),i1.view(np.ndarray),**kwargs)
1175+
else:
1176+
raiseNotImplementedError
1177+
ifunitisNone:
1178+
out_arr=np.array(out_arr)
1179+
else:
1180+
out_arr=QuantityND(out_arr,unit)
1181+
returnout_arr
1182+
1183+
@property
1184+
defv(self):
1185+
returnself.view(np.ndarray)
1186+
1187+
1188+
deftest_quantitynd():
1189+
q=QuantityND([1,2],"m")
1190+
q0,q1=q[:]
1191+
assertnp.all(q.v==np.asarray([1,2]))
1192+
assertq.units=="m"
1193+
assertnp.all((q0+q1).v==np.asarray([3]))
1194+
assert (q0*q1).units=="m*m"
1195+
assert (q1/q0).units=="m/(m)"
1196+
withpytest.raises(ValueError):
1197+
q0+QuantityND(1,"s")
1198+
1199+
1200+
deftest_imshow_quantitynd():
1201+
# generate a dummy ndarray subclass
1202+
arr=QuantityND(np.ones((2,2)),"m")
1203+
fig,ax=plt.subplots()
1204+
ax.imshow(arr)
1205+
# executing the draw should not raise an exception
1206+
fig.canvas.draw()

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp