summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRalf Gommers <ralf.gommers@gmail.com>2019-12-06 11:03:03 -0800
committerGitHub <noreply@github.com>2019-12-06 11:03:03 -0800
commitf6a7a440669c6f386a1b15e081c6db740bb87a88 (patch)
treeeececcc92e1c14eb08d46591ec7aab5932b9ea31
parentabde0a775e19b9f84cb3930f065cdf07f94f8526 (diff)
downloadnumpy-revert-14794-nep-0034-impl.tar.gz
Revert "DEP: issue deprecation warning when creating ragged array (NEP 34)"revert-14794-nep-0034-impl
-rw-r--r--doc/release/upcoming_changes/template.rst1
-rw-r--r--numpy/core/src/multiarray/ctors.c28
-rw-r--r--numpy/core/tests/test_deprecations.py10
-rw-r--r--numpy/core/tests/test_multiarray.py50
-rw-r--r--numpy/core/tests/test_numeric.py2
-rw-r--r--numpy/core/tests/test_regression.py11
-rw-r--r--numpy/core/tests/test_ufunc.py8
-rw-r--r--numpy/lib/tests/test_arraypad.py33
-rw-r--r--numpy/lib/tests/test_io.py2
-rw-r--r--numpy/ma/core.py4
-rw-r--r--numpy/ma/tests/test_core.py2
-rw-r--r--numpy/random/tests/test_generator_mt19937_regressions.py7
-rw-r--r--numpy/random/tests/test_randomstate_regression.py5
-rw-r--r--numpy/random/tests/test_regression.py5
14 files changed, 51 insertions, 117 deletions
diff --git a/doc/release/upcoming_changes/template.rst b/doc/release/upcoming_changes/template.rst
index 997b4850e..9c8a3b5fc 100644
--- a/doc/release/upcoming_changes/template.rst
+++ b/doc/release/upcoming_changes/template.rst
@@ -17,7 +17,6 @@
{% if definitions[category]['showcontent'] %}
{% for text, values in sections[section][category].items() %}
{{ text }}
-
{{ get_indent(text) }}({{values|join(', ') }})
{% endfor %}
diff --git a/numpy/core/src/multiarray/ctors.c b/numpy/core/src/multiarray/ctors.c
index c69782cb6..7276add75 100644
--- a/numpy/core/src/multiarray/ctors.c
+++ b/numpy/core/src/multiarray/ctors.c
@@ -688,12 +688,6 @@ discover_itemsize(PyObject *s, int nd, int *itemsize, int string_type)
return 0;
}
-typedef enum {
- DISCOVERED_OK = 0,
- DISCOVERED_RAGGED = 1,
- DISCOVERED_OBJECT = 2
-} discovered_t;
-
/*
* Take an arbitrary object and discover how many dimensions it
* has, filling in the dimensions as we go.
@@ -701,7 +695,7 @@ typedef enum {
static int
discover_dimensions(PyObject *obj, int *maxndim, npy_intp *d, int check_it,
int stop_at_string, int stop_at_tuple,
- discovered_t *out_is_object)
+ int *out_is_object)
{
PyObject *e;
npy_intp n, i;
@@ -887,7 +881,7 @@ discover_dimensions(PyObject *obj, int *maxndim, npy_intp *d, int check_it,
if (PyErr_ExceptionMatches(PyExc_KeyError)) {
PyErr_Clear();
*maxndim = 0;
- *out_is_object = DISCOVERED_OBJECT;
+ *out_is_object = 1;
return 0;
}
else {
@@ -946,7 +940,7 @@ discover_dimensions(PyObject *obj, int *maxndim, npy_intp *d, int check_it,
*maxndim = all_elems_maxndim + 1;
if (!all_dimensions_match) {
/* typically results in an array containing variable-length lists */
- *out_is_object = DISCOVERED_RAGGED;
+ *out_is_object = 1;
}
}
@@ -1755,7 +1749,7 @@ PyArray_GetArrayParamsFromObject(PyObject *op,
/* Try to treat op as a list of lists */
if (!writeable && PySequence_Check(op)) {
- int check_it, stop_at_string, stop_at_tuple;
+ int check_it, stop_at_string, stop_at_tuple, is_object;
int type_num, type;
/*
@@ -1805,7 +1799,7 @@ PyArray_GetArrayParamsFromObject(PyObject *op,
((*out_dtype)->names || (*out_dtype)->subarray));
*out_ndim = NPY_MAXDIMS;
- discovered_t is_object = DISCOVERED_OK;
+ is_object = 0;
if (discover_dimensions(
op, out_ndim, out_dims, check_it,
stop_at_string, stop_at_tuple, &is_object) < 0) {
@@ -1822,17 +1816,7 @@ PyArray_GetArrayParamsFromObject(PyObject *op,
return 0;
}
/* If object arrays are forced */
- if (is_object != DISCOVERED_OK) {
- if (is_object == DISCOVERED_RAGGED && requested_dtype == NULL) {
- /* NumPy 1.18, 2019-11-01 */
- if (DEPRECATE("Creating an ndarray with automatic object "
- "dtype is deprecated, use dtype=object if you intended "
- "it, otherwise specify an exact dtype") < 0)
- {
- return -1;
- }
- }
- /* either DISCOVERED_OBJECT or there is a requested_dtype */
+ if (is_object) {
Py_DECREF(*out_dtype);
*out_dtype = PyArray_DescrFromType(NPY_OBJECT);
if (*out_dtype == NULL) {
diff --git a/numpy/core/tests/test_deprecations.py b/numpy/core/tests/test_deprecations.py
index de1d76857..363ff26db 100644
--- a/numpy/core/tests/test_deprecations.py
+++ b/numpy/core/tests/test_deprecations.py
@@ -568,13 +568,3 @@ class TestNonZero(_DeprecationTestCase):
def test_zerod(self):
self.assert_deprecated(lambda: np.nonzero(np.array(0)))
self.assert_deprecated(lambda: np.nonzero(np.array(1)))
-
-
-class TestRaggedArray(_DeprecationTestCase):
- # 2019-11-29 1.18.0
- def test_deprecate_ragged_arrays(self):
- # NEP 34 deprecated automatic object dtype when creating ragged
- # arrays. Also see the "ragged" tests in `test_multiarray`
- arg = [1, [2, 3]]
- self.assert_deprecated(np.array, args=(arg,))
-
diff --git a/numpy/core/tests/test_multiarray.py b/numpy/core/tests/test_multiarray.py
index 0235c5063..22d550ecc 100644
--- a/numpy/core/tests/test_multiarray.py
+++ b/numpy/core/tests/test_multiarray.py
@@ -448,7 +448,7 @@ class TestArrayConstruction(object):
assert_equal(r, np.ones((2, 6, 6)))
d = np.ones((6, ))
- r = np.array([[d, d + 1], d + 2], dtype=object)
+ r = np.array([[d, d + 1], d + 2])
assert_equal(len(r), 2)
assert_equal(r[0], [d, d + 1])
assert_equal(r[1], d + 2)
@@ -1051,60 +1051,34 @@ class TestCreation(object):
assert_raises(ValueError, np.ndarray, buffer=buf, strides=(0,),
shape=(max_bytes//itemsize + 1,), dtype=dtype)
- def _ragged_creation(self, seq):
- # without dtype=object, the ragged object should raise
- with assert_warns(DeprecationWarning):
- a = np.array(seq)
- b = np.array(seq, dtype=object)
- assert_equal(a, b)
- return b
-
- def test_ragged_ndim_object(self):
+ def test_jagged_ndim_object(self):
# Lists of mismatching depths are treated as object arrays
- a = self._ragged_creation([[1], 2, 3])
+ a = np.array([[1], 2, 3])
assert_equal(a.shape, (3,))
assert_equal(a.dtype, object)
- a = self._ragged_creation([1, [2], 3])
+ a = np.array([1, [2], 3])
assert_equal(a.shape, (3,))
assert_equal(a.dtype, object)
- a = self._ragged_creation([1, 2, [3]])
+ a = np.array([1, 2, [3]])
assert_equal(a.shape, (3,))
assert_equal(a.dtype, object)
- def test_ragged_shape_object(self):
+ def test_jagged_shape_object(self):
# The jagged dimension of a list is turned into an object array
- a = self._ragged_creation([[1, 1], [2], [3]])
+ a = np.array([[1, 1], [2], [3]])
+ assert_equal(a.shape, (3,))
+ assert_equal(a.dtype, object)
+
+ a = np.array([[1], [2, 2], [3]])
assert_equal(a.shape, (3,))
assert_equal(a.dtype, object)
- a = self._ragged_creation([[1], [2, 2], [3]])
+ a = np.array([[1], [2], [3, 3]])
assert_equal(a.shape, (3,))
assert_equal(a.dtype, object)
- a = self._ragged_creation([[1], [2], [3, 3]])
- assert a.shape == (3,)
- assert a.dtype == object
-
- def test_array_of_ragged_array(self):
- outer = np.array([None, None])
- outer[0] = outer[1] = np.array([1, 2, 3])
- assert np.array(outer).shape == (2,)
- assert np.array([outer]).shape == (1, 2)
-
- outer_ragged = np.array([None, None])
- outer_ragged[0] = np.array([1, 2, 3])
- outer_ragged[1] = np.array([1, 2, 3, 4])
- # should both of these emit deprecation warnings?
- assert np.array(outer_ragged).shape == (2,)
- assert np.array([outer_ragged]).shape == (1, 2,)
-
- def test_deep_nonragged_object(self):
- # None of these should raise, even though they are missing dtype=object
- a = np.array([[[Decimal(1)]]])
- a = np.array([1, Decimal(1)])
- a = np.array([[1], [Decimal(1)]])
class TestStructured(object):
def test_subarray_field_access(self):
diff --git a/numpy/core/tests/test_numeric.py b/numpy/core/tests/test_numeric.py
index 1f8c7e98d..ffebdf648 100644
--- a/numpy/core/tests/test_numeric.py
+++ b/numpy/core/tests/test_numeric.py
@@ -1211,7 +1211,7 @@ class TestNonzero(object):
def test_nonzero_invalid_object(self):
# gh-9295
- a = np.array([np.array([1, 2]), 3], dtype=object)
+ a = np.array([np.array([1, 2]), 3])
assert_raises(ValueError, np.nonzero, a)
class BoolErrors:
diff --git a/numpy/core/tests/test_regression.py b/numpy/core/tests/test_regression.py
index f3e170470..3880b1394 100644
--- a/numpy/core/tests/test_regression.py
+++ b/numpy/core/tests/test_regression.py
@@ -1367,13 +1367,13 @@ class TestRegression(object):
def test_array_from_sequence_scalar_array(self):
# Ticket #1078: segfaults when creating an array with a sequence of
# 0d arrays.
- a = np.array((np.ones(2), np.array(2)), dtype=object)
+ a = np.array((np.ones(2), np.array(2)))
assert_equal(a.shape, (2,))
assert_equal(a.dtype, np.dtype(object))
assert_equal(a[0], np.ones(2))
assert_equal(a[1], np.array(2))
- a = np.array(((1,), np.array(1)), dtype=object)
+ a = np.array(((1,), np.array(1)))
assert_equal(a.shape, (2,))
assert_equal(a.dtype, np.dtype(object))
assert_equal(a[0], (1,))
@@ -1381,7 +1381,7 @@ class TestRegression(object):
def test_array_from_sequence_scalar_array2(self):
# Ticket #1081: weird array with strange input...
- t = np.array([np.array([]), np.array(0, object)], dtype=object)
+ t = np.array([np.array([]), np.array(0, object)])
assert_equal(t.shape, (2,))
assert_equal(t.dtype, np.dtype(object))
@@ -2290,10 +2290,9 @@ class TestRegression(object):
x[0], x[-1] = x[-1], x[0]
uf = np.frompyfunc(f, 1, 0)
- a = np.array([[1, 2, 3], [4, 5], [6, 7, 8, 9]], dtype=object)
+ a = np.array([[1, 2, 3], [4, 5], [6, 7, 8, 9]])
assert_equal(uf(a), ())
- expected = np.array([[3, 2, 1], [5, 4], [9, 7, 8, 6]], dtype=object)
- assert_array_equal(a, expected)
+ assert_array_equal(a, [[3, 2, 1], [5, 4], [9, 7, 8, 6]])
@pytest.mark.skipif(not HAS_REFCOUNT, reason="Python lacks refcounts")
def test_leak_in_structured_dtype_comparison(self):
diff --git a/numpy/core/tests/test_ufunc.py b/numpy/core/tests/test_ufunc.py
index e629945fa..7109de776 100644
--- a/numpy/core/tests/test_ufunc.py
+++ b/numpy/core/tests/test_ufunc.py
@@ -1162,18 +1162,14 @@ class TestUfunc(object):
# Twice reproduced also for tuples:
np.add.accumulate(arr, out=arr)
np.add.accumulate(arr, out=arr)
- assert_array_equal(arr,
- np.array([[1]*i for i in [1, 3, 6, 10]], dtype=object),
- )
+ assert_array_equal(arr, np.array([[1]*i for i in [1, 3, 6, 10]]))
# And the same if the axis argument is used
arr = np.ones((2, 4), dtype=object)
arr[0, :] = [[2] for i in range(4)]
np.add.accumulate(arr, out=arr, axis=-1)
np.add.accumulate(arr, out=arr, axis=-1)
- assert_array_equal(arr[0, :],
- np.array([[2]*i for i in [1, 3, 6, 10]], dtype=object),
- )
+ assert_array_equal(arr[0, :], np.array([[2]*i for i in [1, 3, 6, 10]]))
def test_object_array_reduceat_inplace(self):
# Checks that in-place reduceats work, see also gh-7465
diff --git a/numpy/lib/tests/test_arraypad.py b/numpy/lib/tests/test_arraypad.py
index 1c3507a62..65593dd29 100644
--- a/numpy/lib/tests/test_arraypad.py
+++ b/numpy/lib/tests/test_arraypad.py
@@ -1262,29 +1262,24 @@ class TestPadWidth(object):
with pytest.raises(ValueError, match=match):
np.pad(arr, pad_width, mode)
- @pytest.mark.parametrize("pad_width, dtype", [
- ("3", None),
- ("word", None),
- (None, None),
- (object(), None),
- (3.4, None),
- (((2, 3, 4), (3, 2)), object),
- (complex(1, -1), None),
- (((-2.1, 3), (3, 2)), None),
+ @pytest.mark.parametrize("pad_width", [
+ "3",
+ "word",
+ None,
+ object(),
+ 3.4,
+ ((2, 3, 4), (3, 2)), # dtype=object (tuple)
+ complex(1, -1),
+ ((-2.1, 3), (3, 2)),
])
@pytest.mark.parametrize("mode", _all_modes.keys())
- def test_bad_type(self, pad_width, dtype, mode):
+ def test_bad_type(self, pad_width, mode):
arr = np.arange(30).reshape((6, 5))
match = "`pad_width` must be of integral type."
- if dtype is not None:
- # avoid DeprecationWarning when not specifying dtype
- with pytest.raises(TypeError, match=match):
- np.pad(arr, np.array(pad_width, dtype=dtype), mode)
- else:
- with pytest.raises(TypeError, match=match):
- np.pad(arr, pad_width, mode)
- with pytest.raises(TypeError, match=match):
- np.pad(arr, np.array(pad_width), mode)
+ with pytest.raises(TypeError, match=match):
+ np.pad(arr, pad_width, mode)
+ with pytest.raises(TypeError, match=match):
+ np.pad(arr, np.array(pad_width), mode)
def test_pad_width_as_ndarray(self):
a = np.arange(12)
diff --git a/numpy/lib/tests/test_io.py b/numpy/lib/tests/test_io.py
index 39fe40685..a095e250a 100644
--- a/numpy/lib/tests/test_io.py
+++ b/numpy/lib/tests/test_io.py
@@ -580,7 +580,7 @@ class TestSaveTxt(object):
def test_large_zip(self):
# The test takes at least 6GB of memory, writes a file larger than 4GB
test_data = np.asarray([np.random.rand(np.random.randint(50,100),4)
- for i in range(800000)], dtype=object)
+ for i in range(800000)])
with tempdir() as tmpdir:
np.savez(os.path.join(tmpdir, 'test.npz'), test_data=test_data)
diff --git a/numpy/ma/core.py b/numpy/ma/core.py
index 5aced840a..2baf547a4 100644
--- a/numpy/ma/core.py
+++ b/numpy/ma/core.py
@@ -2828,8 +2828,8 @@ class MaskedArray(ndarray):
elif isinstance(data, (tuple, list)):
try:
# If data is a sequence of masked array
- mask = np.array([getmaskarray(np.asanyarray(m, dtype=mdtype))
- for m in data], dtype=mdtype)
+ mask = np.array([getmaskarray(m) for m in data],
+ dtype=mdtype)
except ValueError:
# If data is nested
mask = nomask
diff --git a/numpy/ma/tests/test_core.py b/numpy/ma/tests/test_core.py
index 3f7226dfb..b72ce56aa 100644
--- a/numpy/ma/tests/test_core.py
+++ b/numpy/ma/tests/test_core.py
@@ -936,7 +936,7 @@ class TestMaskedArray(object):
def test_object_with_array(self):
mx1 = masked_array([1.], mask=[True])
mx2 = masked_array([1., 2.])
- mx = masked_array([mx1, mx2], mask=[False, True], dtype=object)
+ mx = masked_array([mx1, mx2], mask=[False, True])
assert_(mx[0] is mx1)
assert_(mx[1] is not mx2)
assert_(np.all(mx[1].data == mx2.data))
diff --git a/numpy/random/tests/test_generator_mt19937_regressions.py b/numpy/random/tests/test_generator_mt19937_regressions.py
index e328c0c71..3a937f997 100644
--- a/numpy/random/tests/test_generator_mt19937_regressions.py
+++ b/numpy/random/tests/test_generator_mt19937_regressions.py
@@ -56,10 +56,9 @@ class TestRegression(object):
[1, (2, 2), (3, 3), None],
[(1, 1), 2, 3, None]]:
mt19937 = Generator(MT19937(12345))
- shuffled = np.array(t, dtype=object)
+ shuffled = list(t)
mt19937.shuffle(shuffled)
- expected = np.array([t[2], t[0], t[3], t[1]], dtype=object)
- assert_array_equal(np.array(shuffled, dtype=object), expected)
+ assert_array_equal(shuffled, [t[2], t[0], t[3], t[1]])
def test_call_within_randomstate(self):
# Check that custom BitGenerator does not call into global state
@@ -119,7 +118,7 @@ class TestRegression(object):
# a segfault on garbage collection.
# See gh-7719
mt19937 = Generator(MT19937(1234))
- a = np.array([np.arange(1), np.arange(4)], dtype=object)
+ a = np.array([np.arange(1), np.arange(4)])
for _ in range(1000):
mt19937.shuffle(a)
diff --git a/numpy/random/tests/test_randomstate_regression.py b/numpy/random/tests/test_randomstate_regression.py
index 827240cef..bdc2214b6 100644
--- a/numpy/random/tests/test_randomstate_regression.py
+++ b/numpy/random/tests/test_randomstate_regression.py
@@ -68,8 +68,7 @@ class TestRegression(object):
random.seed(12345)
shuffled = list(t)
random.shuffle(shuffled)
- expected = np.array([t[0], t[3], t[1], t[2]], dtype=object)
- assert_array_equal(np.array(shuffled, dtype=object), expected)
+ assert_array_equal(shuffled, [t[0], t[3], t[1], t[2]])
def test_call_within_randomstate(self):
# Check that custom RandomState does not call into global state
@@ -129,7 +128,7 @@ class TestRegression(object):
# a segfault on garbage collection.
# See gh-7719
random.seed(1234)
- a = np.array([np.arange(1), np.arange(4)], dtype=object)
+ a = np.array([np.arange(1), np.arange(4)])
for _ in range(1000):
random.shuffle(a)
diff --git a/numpy/random/tests/test_regression.py b/numpy/random/tests/test_regression.py
index 3cc289a80..509e2d57f 100644
--- a/numpy/random/tests/test_regression.py
+++ b/numpy/random/tests/test_regression.py
@@ -66,8 +66,7 @@ class TestRegression(object):
np.random.seed(12345)
shuffled = list(t)
random.shuffle(shuffled)
- expected = np.array([t[0], t[3], t[1], t[2]], dtype=object)
- assert_array_equal(np.array(shuffled, dtype=object), expected)
+ assert_array_equal(shuffled, [t[0], t[3], t[1], t[2]])
def test_call_within_randomstate(self):
# Check that custom RandomState does not call into global state
@@ -127,7 +126,7 @@ class TestRegression(object):
# a segfault on garbage collection.
# See gh-7719
np.random.seed(1234)
- a = np.array([np.arange(1), np.arange(4)], dtype=object)
+ a = np.array([np.arange(1), np.arange(4)])
for _ in range(1000):
np.random.shuffle(a)