57
57
"digitize" ,
58
58
"histogram" ,
59
59
"histogram_bin_edges" ,
60
- "histogram2d"
60
+ "histogram2d" ,
61
61
"histogramdd" ,
62
62
]
63
63
@@ -753,6 +753,7 @@ def histogram_bin_edges(a, bins=10, range=None, weights=None):
753
753
754
754
755
755
def histogram2d (x , y , bins = 10 , range = None , density = None , weights = None ):
756
+ # pylint: disable=line-too-long
756
757
"""
757
758
Compute the bi-dimensional histogram of two data samples.
758
759
@@ -764,7 +765,7 @@ def histogram2d(x, y, bins=10, range=None, density=None, weights=None):
764
765
y : {dpnp.ndarray, usm_ndarray} of shape (N,)
765
766
An array containing the y coordinates of the points to be
766
767
histogrammed.
767
- bins : {int, list of dpnp.ndarray, list of usm_ndarray, sequence of scalars}, optional
768
+ bins : {int, list of dpnp.ndarray or usm_ndarray, sequence of scalars}, optional
768
769
The bin specification:
769
770
770
771
* If int, the number of bins for the two dimensions (nx=ny=bins).
@@ -822,94 +823,73 @@ def histogram2d(x, y, bins=10, range=None, density=None, weights=None):
822
823
823
824
Examples
824
825
--------
825
- >>> import numpy as np
826
- >>> from matplotlib.image import NonUniformImage
827
- >>> import matplotlib.pyplot as plt
828
-
829
- Construct a 2-D histogram with variable bin width. First define the bin
830
- edges:
831
-
832
- >>> xedges = [0, 1, 3, 5]
833
- >>> yedges = [0, 2, 3, 4, 6]
834
-
835
- Next we create a histogram H with random bin content:
836
-
837
- >>> x = np.random.normal(2, 1, 100)
838
- >>> y = np.random.normal(1, 1, 100)
839
- >>> H, xedges, yedges = np.histogram2d(x, y, bins=(xedges, yedges))
840
- >>> # Histogram does not follow Cartesian convention (see Notes),
841
- >>> # therefore transpose H for visualization purposes.
842
- >>> H = H.T
843
-
844
- :func:`imshow <matplotlib.pyplot.imshow>` can only display square bins:
845
-
846
- >>> fig = plt.figure(figsize=(7, 3))
847
- >>> ax = fig.add_subplot(131, title='imshow: square bins')
848
- >>> plt.imshow(H, interpolation='nearest', origin='lower',
849
- ... extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]])
850
- <matplotlib.image.AxesImage object at 0x...>
851
-
852
- :func:`pcolormesh <matplotlib.pyplot.pcolormesh>` can display actual edges:
853
-
854
- >>> ax = fig.add_subplot(132, title='pcolormesh: actual edges',
855
- ... aspect='equal')
856
- >>> X, Y = np.meshgrid(xedges, yedges)
857
- >>> ax.pcolormesh(X, Y, H)
858
- <matplotlib.collections.QuadMesh object at 0x...>
859
-
860
- :class:`NonUniformImage <matplotlib.image.NonUniformImage>` can be used to
861
- display actual bin edges with interpolation:
862
-
863
- >>> ax = fig.add_subplot(133, title='NonUniformImage: interpolated',
864
- ... aspect='equal', xlim=xedges[[0, -1]], ylim=yedges[[0, -1]])
865
- >>> im = NonUniformImage(ax, interpolation='bilinear')
866
- >>> xcenters = (xedges[:-1] + xedges[1:]) / 2
867
- >>> ycenters = (yedges[:-1] + yedges[1:]) / 2
868
- >>> im.set_data(xcenters, ycenters, H)
869
- >>> ax.add_image(im)
870
- >>> plt.show()
871
-
872
- It is also possible to construct a 2-D histogram without specifying bin
873
- edges:
874
-
875
- >>> # Generate non-symmetric test data
876
- >>> n = 10000
877
- >>> x = np.linspace(1, 100, n)
878
- >>> y = 2*np.log(x) + np.random.rand(n) - 0.5
879
- >>> # Compute 2d histogram. Note the order of x/y and xedges/yedges
880
- >>> H, yedges, xedges = np.histogram2d(y, x, bins=20)
881
-
882
- Now we can plot the histogram using
883
- :func:`pcolormesh <matplotlib.pyplot.pcolormesh>`, and a
884
- :func:`hexbin <matplotlib.pyplot.hexbin>` for comparison.
885
-
886
- >>> # Plot histogram using pcolormesh
887
- >>> fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True)
888
- >>> ax1.pcolormesh(xedges, yedges, H, cmap='rainbow')
889
- >>> ax1.plot(x, 2*np.log(x), 'k-')
890
- >>> ax1.set_xlim(x.min(), x.max())
891
- >>> ax1.set_ylim(y.min(), y.max())
892
- >>> ax1.set_xlabel('x')
893
- >>> ax1.set_ylabel('y')
894
- >>> ax1.set_title('histogram2d')
895
- >>> ax1.grid()
896
-
897
- >>> # Create hexbin plot for comparison
898
- >>> ax2.hexbin(x, y, gridsize=20, cmap='rainbow')
899
- >>> ax2.plot(x, 2*np.log(x), 'k-')
900
- >>> ax2.set_title('hexbin')
901
- >>> ax2.set_xlim(x.min(), x.max())
902
- >>> ax2.set_xlabel('x')
903
- >>> ax2.grid()
904
-
905
- >>> plt.show()
826
+ >>> import dpnp as np
827
+ >>> x = np.random.randn(20)
828
+ >>> y = np.random.randn(20)
829
+ >>> hist, edges_x, edges_y = np.histogram2d(x, y, bins=(4, 3))
830
+ >>> hist
831
+ [[1. 0. 0.]
832
+ [0. 0. 0.]
833
+ [5. 6. 4.]
834
+ [1. 2. 1.]]
835
+ >>> edges_x
836
+ [-5.6575713 -3.5574734 -1.4573755 0.6427226 2.74282 ]
837
+ >>> edges_y
838
+ [-1.1889046 -0.07263839 1.0436279 2.159894 ]
906
839
"""
840
+ # pylint: enable=line-too-long
841
+
842
+ dpnp .check_supported_arrays_type (x , y )
843
+ if weights is not None :
844
+ dpnp .check_supported_arrays_type (weights )
845
+
846
+ if x .ndim != 1 or y .ndim != 1 :
847
+ raise ValueError (
848
+ f"x and y must be 1-dimensional arrays."
849
+ f"Got { x .ndim } and { y .ndim } respectively"
850
+ )
907
851
908
852
if len (x ) != len (y ):
909
- raise ValueError (f'x and y must have the same length. Got { len (x )} and { len (y )} respectively' )
853
+ raise ValueError (
854
+ f"x and y must have the same length."
855
+ f"Got { len (x )} and { len (y )} respectively"
856
+ )
857
+
858
+ usm_type , exec_q = get_usm_allocations ([x , y , bins , range , weights ])
859
+ device = exec_q .sycl_device
910
860
861
+ sample_dtype = _result_type_for_device ([x .dtype , y .dtype ], device )
911
862
912
- hist , edges = histogramdd ([x , y ], bins , range , density , weights )
863
+ # Unlike histogramdd histogram2d accepts 1d bins and
864
+ # apply it to both dimensions
865
+ # at the same moment two elements bins should be interpreted as
866
+ # number of bins in each dimension and array-like bins with one element
867
+ # is not allowed
868
+ if isinstance (bins , Iterable ) and len (bins ) > 2 :
869
+ bins = [bins ] * 2
870
+
871
+ bins = _histdd_normalize_bins (bins , 2 )
872
+ bins_dtypes = [sample_dtype ]
873
+ bins_dtypes += [b .dtype for b in bins if hasattr (b , "dtype" )]
874
+
875
+ bins_dtype = _result_type_for_device (bins_dtypes , device )
876
+ hist_dtype = _histdd_hist_dtype (exec_q , weights )
877
+
878
+ supported_types = statistics_ext .histogramdd_dtypes ()
879
+
880
+ sample_dtype , _ = _align_dtypes (
881
+ sample_dtype , bins_dtype , hist_dtype , supported_types , device
882
+ )
883
+
884
+ sample = dpnp .empty_like (
885
+ x , shape = x .shape + (2 ,), dtype = sample_dtype , usm_type = usm_type
886
+ )
887
+ sample [:, 0 ] = x
888
+ sample [:, 1 ] = y
889
+
890
+ hist , edges = histogramdd (
891
+ sample , bins = bins , range = range , density = density , weights = weights
892
+ )
913
893
return hist , edges [0 ], edges [1 ]
914
894
915
895
@@ -1080,7 +1060,7 @@ def _histdd_extract_arrays(sample, weights, bins):
1080
1060
return all_arrays
1081
1061
1082
1062
1083
- def histogramdd (sample , bins = 10 , range = None , weights = None , density = False ):
1063
+ def histogramdd (sample , bins = 10 , range = None , density = False , weights = None ):
1084
1064
"""
1085
1065
Compute the multidimensional histogram of some data.
1086
1066
@@ -1155,7 +1135,7 @@ def histogramdd(sample, bins=10, range=None, weights=None, density=False):
1155
1135
elif sample .ndim > 2 :
1156
1136
raise ValueError ("sample must have no more than 2 dimensions" )
1157
1137
1158
- ndim = sample .shape [1 ] if sample . size > 0 else 1
1138
+ ndim = sample .shape [1 ]
1159
1139
1160
1140
_arrays = _histdd_extract_arrays (sample , weights , bins )
1161
1141
usm_type , queue = get_usm_allocations (_arrays )
0 commit comments