test_numpy_array.py revision 12037
15132Sgblack@eecs.umich.eduimport pytest 25132Sgblack@eecs.umich.edu 35132Sgblack@eecs.umich.edupytestmark = pytest.requires_numpy 45132Sgblack@eecs.umich.edu 55132Sgblack@eecs.umich.eduwith pytest.suppress(ImportError): 65132Sgblack@eecs.umich.edu import numpy as np 75132Sgblack@eecs.umich.edu 85132Sgblack@eecs.umich.edu 95132Sgblack@eecs.umich.edu@pytest.fixture(scope='function') 105132Sgblack@eecs.umich.edudef arr(): 115132Sgblack@eecs.umich.edu return np.array([[1, 2, 3], [4, 5, 6]], '=u2') 125132Sgblack@eecs.umich.edu 135132Sgblack@eecs.umich.edu 145132Sgblack@eecs.umich.edudef test_array_attributes(): 155132Sgblack@eecs.umich.edu from pybind11_tests.array import ( 165132Sgblack@eecs.umich.edu ndim, shape, strides, writeable, size, itemsize, nbytes, owndata 175132Sgblack@eecs.umich.edu ) 185132Sgblack@eecs.umich.edu 195132Sgblack@eecs.umich.edu a = np.array(0, 'f8') 205132Sgblack@eecs.umich.edu assert ndim(a) == 0 215132Sgblack@eecs.umich.edu assert all(shape(a) == []) 225132Sgblack@eecs.umich.edu assert all(strides(a) == []) 235132Sgblack@eecs.umich.edu with pytest.raises(IndexError) as excinfo: 245132Sgblack@eecs.umich.edu shape(a, 0) 255132Sgblack@eecs.umich.edu assert str(excinfo.value) == 'invalid axis: 0 (ndim = 0)' 265132Sgblack@eecs.umich.edu with pytest.raises(IndexError) as excinfo: 275132Sgblack@eecs.umich.edu strides(a, 0) 285132Sgblack@eecs.umich.edu assert str(excinfo.value) == 'invalid axis: 0 (ndim = 0)' 295132Sgblack@eecs.umich.edu assert writeable(a) 305132Sgblack@eecs.umich.edu assert size(a) == 1 315132Sgblack@eecs.umich.edu assert itemsize(a) == 8 325132Sgblack@eecs.umich.edu assert nbytes(a) == 8 335132Sgblack@eecs.umich.edu assert owndata(a) 345132Sgblack@eecs.umich.edu 355132Sgblack@eecs.umich.edu a = np.array([[1, 2, 3], [4, 5, 6]], 'u2').view() 365132Sgblack@eecs.umich.edu a.flags.writeable = False 375132Sgblack@eecs.umich.edu assert ndim(a) == 2 385132Sgblack@eecs.umich.edu assert all(shape(a) == [2, 3]) 395132Sgblack@eecs.umich.edu assert shape(a, 0) == 2 405132Sgblack@eecs.umich.edu assert shape(a, 1) == 3 415132Sgblack@eecs.umich.edu assert all(strides(a) == [6, 2]) 425132Sgblack@eecs.umich.edu assert strides(a, 0) == 6 435132Sgblack@eecs.umich.edu assert strides(a, 1) == 2 445132Sgblack@eecs.umich.edu with pytest.raises(IndexError) as excinfo: 455132Sgblack@eecs.umich.edu shape(a, 2) 465132Sgblack@eecs.umich.edu assert str(excinfo.value) == 'invalid axis: 2 (ndim = 2)' 475132Sgblack@eecs.umich.edu with pytest.raises(IndexError) as excinfo: 485132Sgblack@eecs.umich.edu strides(a, 2) 495132Sgblack@eecs.umich.edu assert str(excinfo.value) == 'invalid axis: 2 (ndim = 2)' 505132Sgblack@eecs.umich.edu assert not writeable(a) 515132Sgblack@eecs.umich.edu assert size(a) == 6 525132Sgblack@eecs.umich.edu assert itemsize(a) == 2 535132Sgblack@eecs.umich.edu assert nbytes(a) == 12 545132Sgblack@eecs.umich.edu assert not owndata(a) 555132Sgblack@eecs.umich.edu 565132Sgblack@eecs.umich.edu 575132Sgblack@eecs.umich.edu@pytest.mark.parametrize('args, ret', [([], 0), ([0], 0), ([1], 3), ([0, 1], 1), ([1, 2], 5)]) 585612Sgblack@eecs.umich.edudef test_index_offset(arr, args, ret): 595299Sgblack@eecs.umich.edu from pybind11_tests.array import index_at, index_at_t, offset_at, offset_at_t 605132Sgblack@eecs.umich.edu assert index_at(arr, *args) == ret 615132Sgblack@eecs.umich.edu assert index_at_t(arr, *args) == ret 625132Sgblack@eecs.umich.edu assert offset_at(arr, *args) == ret * arr.dtype.itemsize 635132Sgblack@eecs.umich.edu assert offset_at_t(arr, *args) == ret * arr.dtype.itemsize 645132Sgblack@eecs.umich.edu 655132Sgblack@eecs.umich.edu 665299Sgblack@eecs.umich.edudef test_dim_check_fail(arr): 675132Sgblack@eecs.umich.edu from pybind11_tests.array import (index_at, index_at_t, offset_at, offset_at_t, data, data_t, 685132Sgblack@eecs.umich.edu mutate_data, mutate_data_t) 695132Sgblack@eecs.umich.edu for func in (index_at, index_at_t, offset_at, offset_at_t, data, data_t, 705132Sgblack@eecs.umich.edu mutate_data, mutate_data_t): 715132Sgblack@eecs.umich.edu with pytest.raises(IndexError) as excinfo: 725299Sgblack@eecs.umich.edu func(arr, 1, 2, 3) 735299Sgblack@eecs.umich.edu assert str(excinfo.value) == 'too many indices for an array: 3 (ndim = 2)' 745132Sgblack@eecs.umich.edu 755132Sgblack@eecs.umich.edu 765615Sgblack@eecs.umich.edu@pytest.mark.parametrize('args, ret', 775615Sgblack@eecs.umich.edu [([], [1, 2, 3, 4, 5, 6]), 785132Sgblack@eecs.umich.edu ([1], [4, 5, 6]), 795299Sgblack@eecs.umich.edu ([0, 1], [2, 3, 4, 5, 6]), 805299Sgblack@eecs.umich.edu ([1, 2], [6])]) 815299Sgblack@eecs.umich.edudef test_data(arr, args, ret): 825299Sgblack@eecs.umich.edu from pybind11_tests.array import data, data_t 835299Sgblack@eecs.umich.edu from sys import byteorder 845299Sgblack@eecs.umich.edu assert all(data_t(arr, *args) == ret) 855299Sgblack@eecs.umich.edu assert all(data(arr, *args)[(0 if byteorder == 'little' else 1)::2] == ret) 865299Sgblack@eecs.umich.edu assert all(data(arr, *args)[(1 if byteorder == 'little' else 0)::2] == 0) 875299Sgblack@eecs.umich.edu 885299Sgblack@eecs.umich.edu 895299Sgblack@eecs.umich.edudef test_mutate_readonly(arr): 905299Sgblack@eecs.umich.edu from pybind11_tests.array import mutate_data, mutate_data_t, mutate_at_t 915299Sgblack@eecs.umich.edu arr.flags.writeable = False 925299Sgblack@eecs.umich.edu for func, args in (mutate_data, ()), (mutate_data_t, ()), (mutate_at_t, (0, 0)): 935299Sgblack@eecs.umich.edu with pytest.raises(ValueError) as excinfo: 945299Sgblack@eecs.umich.edu func(arr, *args) 955299Sgblack@eecs.umich.edu assert str(excinfo.value) == 'array is not writeable' 965299Sgblack@eecs.umich.edu 975299Sgblack@eecs.umich.edu 985299Sgblack@eecs.umich.edu@pytest.mark.parametrize('dim', [0, 1, 3]) 995299Sgblack@eecs.umich.edudef test_at_fail(arr, dim): 1005299Sgblack@eecs.umich.edu from pybind11_tests.array import at_t, mutate_at_t 1015299Sgblack@eecs.umich.edu for func in at_t, mutate_at_t: 1025299Sgblack@eecs.umich.edu with pytest.raises(IndexError) as excinfo: 1035299Sgblack@eecs.umich.edu func(arr, *([0] * dim)) 1045299Sgblack@eecs.umich.edu assert str(excinfo.value) == 'index dimension mismatch: {} (ndim = 2)'.format(dim) 1055299Sgblack@eecs.umich.edu 1065299Sgblack@eecs.umich.edu 1075299Sgblack@eecs.umich.edudef test_at(arr): 1085299Sgblack@eecs.umich.edu from pybind11_tests.array import at_t, mutate_at_t 1095299Sgblack@eecs.umich.edu 1105299Sgblack@eecs.umich.edu assert at_t(arr, 0, 2) == 3 1115299Sgblack@eecs.umich.edu assert at_t(arr, 1, 0) == 4 1125299Sgblack@eecs.umich.edu 1135299Sgblack@eecs.umich.edu assert all(mutate_at_t(arr, 0, 2).ravel() == [1, 2, 4, 4, 5, 6]) 1145299Sgblack@eecs.umich.edu assert all(mutate_at_t(arr, 1, 0).ravel() == [1, 2, 4, 5, 5, 6]) 1155299Sgblack@eecs.umich.edu 1165299Sgblack@eecs.umich.edu 1175299Sgblack@eecs.umich.edudef test_mutate_data(arr): 1185299Sgblack@eecs.umich.edu from pybind11_tests.array import mutate_data, mutate_data_t 1195299Sgblack@eecs.umich.edu 1205299Sgblack@eecs.umich.edu assert all(mutate_data(arr).ravel() == [2, 4, 6, 8, 10, 12]) 1215299Sgblack@eecs.umich.edu assert all(mutate_data(arr).ravel() == [4, 8, 12, 16, 20, 24]) 1225299Sgblack@eecs.umich.edu assert all(mutate_data(arr, 1).ravel() == [4, 8, 12, 32, 40, 48]) 1235299Sgblack@eecs.umich.edu assert all(mutate_data(arr, 0, 1).ravel() == [4, 16, 24, 64, 80, 96]) 1245299Sgblack@eecs.umich.edu assert all(mutate_data(arr, 1, 2).ravel() == [4, 16, 24, 64, 80, 192]) 1255299Sgblack@eecs.umich.edu 1265299Sgblack@eecs.umich.edu assert all(mutate_data_t(arr).ravel() == [5, 17, 25, 65, 81, 193]) 1275299Sgblack@eecs.umich.edu assert all(mutate_data_t(arr).ravel() == [6, 18, 26, 66, 82, 194]) 1285299Sgblack@eecs.umich.edu assert all(mutate_data_t(arr, 1).ravel() == [6, 18, 26, 67, 83, 195]) 1295299Sgblack@eecs.umich.edu assert all(mutate_data_t(arr, 0, 1).ravel() == [6, 19, 27, 68, 84, 196]) 1305299Sgblack@eecs.umich.edu assert all(mutate_data_t(arr, 1, 2).ravel() == [6, 19, 27, 68, 84, 197]) 1315299Sgblack@eecs.umich.edu 1325299Sgblack@eecs.umich.edu 1335299Sgblack@eecs.umich.edudef test_bounds_check(arr): 1345299Sgblack@eecs.umich.edu from pybind11_tests.array import (index_at, index_at_t, data, data_t, 1355299Sgblack@eecs.umich.edu mutate_data, mutate_data_t, at_t, mutate_at_t) 1365299Sgblack@eecs.umich.edu funcs = (index_at, index_at_t, data, data_t, 1375299Sgblack@eecs.umich.edu mutate_data, mutate_data_t, at_t, mutate_at_t) 1385299Sgblack@eecs.umich.edu for func in funcs: 1395299Sgblack@eecs.umich.edu with pytest.raises(IndexError) as excinfo: 1405299Sgblack@eecs.umich.edu func(arr, 2, 0) 1415299Sgblack@eecs.umich.edu assert str(excinfo.value) == 'index 2 is out of bounds for axis 0 with size 2' 1425299Sgblack@eecs.umich.edu with pytest.raises(IndexError) as excinfo: 1435299Sgblack@eecs.umich.edu func(arr, 0, 4) 1445299Sgblack@eecs.umich.edu assert str(excinfo.value) == 'index 4 is out of bounds for axis 1 with size 3' 1455299Sgblack@eecs.umich.edu 1465299Sgblack@eecs.umich.edu 1475299Sgblack@eecs.umich.edudef test_make_c_f_array(): 1485299Sgblack@eecs.umich.edu from pybind11_tests.array import ( 1495299Sgblack@eecs.umich.edu make_c_array, make_f_array 1505299Sgblack@eecs.umich.edu ) 1515299Sgblack@eecs.umich.edu assert make_c_array().flags.c_contiguous 1525299Sgblack@eecs.umich.edu assert not make_c_array().flags.f_contiguous 1535299Sgblack@eecs.umich.edu assert make_f_array().flags.f_contiguous 1545299Sgblack@eecs.umich.edu assert not make_f_array().flags.c_contiguous 1555299Sgblack@eecs.umich.edu 1565299Sgblack@eecs.umich.edu 1575299Sgblack@eecs.umich.edudef test_wrap(): 1585299Sgblack@eecs.umich.edu from pybind11_tests.array import wrap 1595299Sgblack@eecs.umich.edu 1605299Sgblack@eecs.umich.edu def assert_references(a, b, base=None): 1615299Sgblack@eecs.umich.edu if base is None: 1625299Sgblack@eecs.umich.edu base = a 1635299Sgblack@eecs.umich.edu assert a is not b 1645299Sgblack@eecs.umich.edu assert a.__array_interface__['data'][0] == b.__array_interface__['data'][0] 1655299Sgblack@eecs.umich.edu assert a.shape == b.shape 1665299Sgblack@eecs.umich.edu assert a.strides == b.strides 1675299Sgblack@eecs.umich.edu assert a.flags.c_contiguous == b.flags.c_contiguous 1685299Sgblack@eecs.umich.edu assert a.flags.f_contiguous == b.flags.f_contiguous 1695299Sgblack@eecs.umich.edu assert a.flags.writeable == b.flags.writeable 1705299Sgblack@eecs.umich.edu assert a.flags.aligned == b.flags.aligned 1715299Sgblack@eecs.umich.edu assert a.flags.updateifcopy == b.flags.updateifcopy 1725299Sgblack@eecs.umich.edu assert np.all(a == b) 1735299Sgblack@eecs.umich.edu assert not b.flags.owndata 1745299Sgblack@eecs.umich.edu assert b.base is base 1755299Sgblack@eecs.umich.edu if a.flags.writeable and a.ndim == 2: 1765299Sgblack@eecs.umich.edu a[0, 0] = 1234 1775299Sgblack@eecs.umich.edu assert b[0, 0] == 1234 1785299Sgblack@eecs.umich.edu 1795299Sgblack@eecs.umich.edu a1 = np.array([1, 2], dtype=np.int16) 1805299Sgblack@eecs.umich.edu assert a1.flags.owndata and a1.base is None 1815299Sgblack@eecs.umich.edu a2 = wrap(a1) 1825299Sgblack@eecs.umich.edu assert_references(a1, a2) 1835299Sgblack@eecs.umich.edu 1845299Sgblack@eecs.umich.edu a1 = np.array([[1, 2], [3, 4]], dtype=np.float32, order='F') 1855299Sgblack@eecs.umich.edu assert a1.flags.owndata and a1.base is None 1865299Sgblack@eecs.umich.edu a2 = wrap(a1) 1875299Sgblack@eecs.umich.edu assert_references(a1, a2) 1885299Sgblack@eecs.umich.edu 1895299Sgblack@eecs.umich.edu a1 = np.array([[1, 2], [3, 4]], dtype=np.float32, order='C') 1905299Sgblack@eecs.umich.edu a1.flags.writeable = False 1915299Sgblack@eecs.umich.edu a2 = wrap(a1) 1925299Sgblack@eecs.umich.edu assert_references(a1, a2) 1935299Sgblack@eecs.umich.edu 1945299Sgblack@eecs.umich.edu a1 = np.random.random((4, 4, 4)) 1955299Sgblack@eecs.umich.edu a2 = wrap(a1) 1965299Sgblack@eecs.umich.edu assert_references(a1, a2) 1975299Sgblack@eecs.umich.edu 1985299Sgblack@eecs.umich.edu a1t = a1.transpose() 1995299Sgblack@eecs.umich.edu a2 = wrap(a1t) 2005299Sgblack@eecs.umich.edu assert_references(a1t, a2, a1) 2015299Sgblack@eecs.umich.edu 2025299Sgblack@eecs.umich.edu a1d = a1.diagonal() 2035299Sgblack@eecs.umich.edu a2 = wrap(a1d) 2045299Sgblack@eecs.umich.edu assert_references(a1d, a2, a1) 2055299Sgblack@eecs.umich.edu 2065299Sgblack@eecs.umich.edu 2075299Sgblack@eecs.umich.edudef test_numpy_view(capture): 2085299Sgblack@eecs.umich.edu from pybind11_tests.array import ArrayClass 2095299Sgblack@eecs.umich.edu with capture: 2105299Sgblack@eecs.umich.edu ac = ArrayClass() 2115299Sgblack@eecs.umich.edu ac_view_1 = ac.numpy_view() 2125299Sgblack@eecs.umich.edu ac_view_2 = ac.numpy_view() 2135299Sgblack@eecs.umich.edu assert np.all(ac_view_1 == np.array([1, 2], dtype=np.int32)) 2145299Sgblack@eecs.umich.edu del ac 2155299Sgblack@eecs.umich.edu pytest.gc_collect() 2165299Sgblack@eecs.umich.edu assert capture == """ 2175299Sgblack@eecs.umich.edu ArrayClass() 2185299Sgblack@eecs.umich.edu ArrayClass::numpy_view() 2195299Sgblack@eecs.umich.edu ArrayClass::numpy_view() 2205299Sgblack@eecs.umich.edu """ 2215299Sgblack@eecs.umich.edu ac_view_1[0] = 4 2225299Sgblack@eecs.umich.edu ac_view_1[1] = 3 2235299Sgblack@eecs.umich.edu assert ac_view_2[0] == 4 2245299Sgblack@eecs.umich.edu assert ac_view_2[1] == 3 2255299Sgblack@eecs.umich.edu with capture: 2265299Sgblack@eecs.umich.edu del ac_view_1 2275299Sgblack@eecs.umich.edu del ac_view_2 2285299Sgblack@eecs.umich.edu pytest.gc_collect() 2295299Sgblack@eecs.umich.edu pytest.gc_collect() 2305299Sgblack@eecs.umich.edu assert capture == """ 2315299Sgblack@eecs.umich.edu ~ArrayClass() 2325299Sgblack@eecs.umich.edu """ 2335334Sgblack@eecs.umich.edu 2345615Sgblack@eecs.umich.edu 2355615Sgblack@eecs.umich.edu@pytest.unsupported_on_pypy 2365615Sgblack@eecs.umich.edudef test_cast_numpy_int64_to_uint64(): 2375334Sgblack@eecs.umich.edu from pybind11_tests.array import function_taking_uint64 2385615Sgblack@eecs.umich.edu function_taking_uint64(123) 2395615Sgblack@eecs.umich.edu function_taking_uint64(np.uint64(123)) 2405299Sgblack@eecs.umich.edu 2415299Sgblack@eecs.umich.edu 2425334Sgblack@eecs.umich.edudef test_isinstance(): 2435615Sgblack@eecs.umich.edu from pybind11_tests.array import isinstance_untyped, isinstance_typed 2445615Sgblack@eecs.umich.edu 2455334Sgblack@eecs.umich.edu assert isinstance_untyped(np.array([1, 2, 3]), "not an array") 2465334Sgblack@eecs.umich.edu assert isinstance_typed(np.array([1.0, 2.0, 3.0])) 2475334Sgblack@eecs.umich.edu 2485334Sgblack@eecs.umich.edu 2495334Sgblack@eecs.umich.edudef test_constructors(): 2505334Sgblack@eecs.umich.edu from pybind11_tests.array import default_constructors, converting_constructors 2515615Sgblack@eecs.umich.edu 2525615Sgblack@eecs.umich.edu defaults = default_constructors() 2535615Sgblack@eecs.umich.edu for a in defaults.values(): 2545334Sgblack@eecs.umich.edu assert a.size == 0 2555615Sgblack@eecs.umich.edu assert defaults["array"].dtype == np.array([]).dtype 2565615Sgblack@eecs.umich.edu assert defaults["array_t<int32>"].dtype == np.int32 2575615Sgblack@eecs.umich.edu assert defaults["array_t<double>"].dtype == np.float64 2585615Sgblack@eecs.umich.edu 2595615Sgblack@eecs.umich.edu results = converting_constructors([1, 2, 3]) 2605615Sgblack@eecs.umich.edu for a in results.values(): 2615334Sgblack@eecs.umich.edu np.testing.assert_array_equal(a, [1, 2, 3]) 2625334Sgblack@eecs.umich.edu assert results["array"].dtype == np.int_ 2635334Sgblack@eecs.umich.edu assert results["array_t<int32>"].dtype == np.int32 2645132Sgblack@eecs.umich.edu assert results["array_t<double>"].dtype == np.float64 2655132Sgblack@eecs.umich.edu 2665334Sgblack@eecs.umich.edu 2675132Sgblack@eecs.umich.edudef test_overload_resolution(msg): 2685132Sgblack@eecs.umich.edu from pybind11_tests.array import overloaded, overloaded2, overloaded3, overloaded4, overloaded5 2695132Sgblack@eecs.umich.edu 2705132Sgblack@eecs.umich.edu # Exact overload matches: 2715132Sgblack@eecs.umich.edu assert overloaded(np.array([1], dtype='float64')) == 'double' 2725132Sgblack@eecs.umich.edu assert overloaded(np.array([1], dtype='float32')) == 'float' 2735132Sgblack@eecs.umich.edu assert overloaded(np.array([1], dtype='ushort')) == 'unsigned short' 2745132Sgblack@eecs.umich.edu assert overloaded(np.array([1], dtype='intc')) == 'int' 2755132Sgblack@eecs.umich.edu assert overloaded(np.array([1], dtype='longlong')) == 'long long' 2765132Sgblack@eecs.umich.edu assert overloaded(np.array([1], dtype='complex')) == 'double complex' 2775132Sgblack@eecs.umich.edu assert overloaded(np.array([1], dtype='csingle')) == 'float complex' 2785132Sgblack@eecs.umich.edu 2795132Sgblack@eecs.umich.edu # No exact match, should call first convertible version: 2805132Sgblack@eecs.umich.edu assert overloaded(np.array([1], dtype='uint8')) == 'double' 2815132Sgblack@eecs.umich.edu 2825132Sgblack@eecs.umich.edu with pytest.raises(TypeError) as excinfo: 2835132Sgblack@eecs.umich.edu overloaded("not an array") 2845132Sgblack@eecs.umich.edu assert msg(excinfo.value) == """ 2855132Sgblack@eecs.umich.edu overloaded(): incompatible function arguments. The following argument types are supported: 2865132Sgblack@eecs.umich.edu 1. (arg0: numpy.ndarray[float64]) -> str 287 2. (arg0: numpy.ndarray[float32]) -> str 288 3. (arg0: numpy.ndarray[int32]) -> str 289 4. (arg0: numpy.ndarray[uint16]) -> str 290 5. (arg0: numpy.ndarray[int64]) -> str 291 6. (arg0: numpy.ndarray[complex128]) -> str 292 7. (arg0: numpy.ndarray[complex64]) -> str 293 294 Invoked with: 'not an array' 295 """ 296 297 assert overloaded2(np.array([1], dtype='float64')) == 'double' 298 assert overloaded2(np.array([1], dtype='float32')) == 'float' 299 assert overloaded2(np.array([1], dtype='complex64')) == 'float complex' 300 assert overloaded2(np.array([1], dtype='complex128')) == 'double complex' 301 assert overloaded2(np.array([1], dtype='float32')) == 'float' 302 303 assert overloaded3(np.array([1], dtype='float64')) == 'double' 304 assert overloaded3(np.array([1], dtype='intc')) == 'int' 305 expected_exc = """ 306 overloaded3(): incompatible function arguments. The following argument types are supported: 307 1. (arg0: numpy.ndarray[int32]) -> str 308 2. (arg0: numpy.ndarray[float64]) -> str 309 310 Invoked with:""" 311 312 with pytest.raises(TypeError) as excinfo: 313 overloaded3(np.array([1], dtype='uintc')) 314 assert msg(excinfo.value) == expected_exc + " array([1], dtype=uint32)" 315 with pytest.raises(TypeError) as excinfo: 316 overloaded3(np.array([1], dtype='float32')) 317 assert msg(excinfo.value) == expected_exc + " array([ 1.], dtype=float32)" 318 with pytest.raises(TypeError) as excinfo: 319 overloaded3(np.array([1], dtype='complex')) 320 assert msg(excinfo.value) == expected_exc + " array([ 1.+0.j])" 321 322 # Exact matches: 323 assert overloaded4(np.array([1], dtype='double')) == 'double' 324 assert overloaded4(np.array([1], dtype='longlong')) == 'long long' 325 # Non-exact matches requiring conversion. Since float to integer isn't a 326 # save conversion, it should go to the double overload, but short can go to 327 # either (and so should end up on the first-registered, the long long). 328 assert overloaded4(np.array([1], dtype='float32')) == 'double' 329 assert overloaded4(np.array([1], dtype='short')) == 'long long' 330 331 assert overloaded5(np.array([1], dtype='double')) == 'double' 332 assert overloaded5(np.array([1], dtype='uintc')) == 'unsigned int' 333 assert overloaded5(np.array([1], dtype='float32')) == 'unsigned int' 334 335 336def test_greedy_string_overload(): # issue 685 337 from pybind11_tests.array import issue685 338 339 assert issue685("abc") == "string" 340 assert issue685(np.array([97, 98, 99], dtype='b')) == "array" 341 assert issue685(123) == "other" 342 343 344def test_array_unchecked_fixed_dims(msg): 345 from pybind11_tests.array import (proxy_add2, proxy_init3F, proxy_init3, proxy_squared_L2_norm, 346 proxy_auxiliaries2, array_auxiliaries2) 347 348 z1 = np.array([[1, 2], [3, 4]], dtype='float64') 349 proxy_add2(z1, 10) 350 assert np.all(z1 == [[11, 12], [13, 14]]) 351 352 with pytest.raises(ValueError) as excinfo: 353 proxy_add2(np.array([1., 2, 3]), 5.0) 354 assert msg(excinfo.value) == "array has incorrect number of dimensions: 1; expected 2" 355 356 expect_c = np.ndarray(shape=(3, 3, 3), buffer=np.array(range(3, 30)), dtype='int') 357 assert np.all(proxy_init3(3.0) == expect_c) 358 expect_f = np.transpose(expect_c) 359 assert np.all(proxy_init3F(3.0) == expect_f) 360 361 assert proxy_squared_L2_norm(np.array(range(6))) == 55 362 assert proxy_squared_L2_norm(np.array(range(6), dtype="float64")) == 55 363 364 assert proxy_auxiliaries2(z1) == [11, 11, True, 2, 8, 2, 2, 4, 32] 365 assert proxy_auxiliaries2(z1) == array_auxiliaries2(z1) 366 367 368def test_array_unchecked_dyn_dims(msg): 369 from pybind11_tests.array import (proxy_add2_dyn, proxy_init3_dyn, proxy_auxiliaries2_dyn, 370 array_auxiliaries2) 371 z1 = np.array([[1, 2], [3, 4]], dtype='float64') 372 proxy_add2_dyn(z1, 10) 373 assert np.all(z1 == [[11, 12], [13, 14]]) 374 375 expect_c = np.ndarray(shape=(3, 3, 3), buffer=np.array(range(3, 30)), dtype='int') 376 assert np.all(proxy_init3_dyn(3.0) == expect_c) 377 378 assert proxy_auxiliaries2_dyn(z1) == [11, 11, True, 2, 8, 2, 2, 4, 32] 379 assert proxy_auxiliaries2_dyn(z1) == array_auxiliaries2(z1) 380