dev-python/numpy: Clean old versions up

This commit is contained in:
Michał Górny
2017-05-03 09:20:38 +02:00
parent 1328f190af
commit 13d21eda13
9 changed files with 0 additions and 915 deletions

View File

@@ -1,127 +0,0 @@
From 3a816a4db9b498eb64eb837fdcca0fa8ddbe063e Mon Sep 17 00:00:00 2001
From: Allan Haldane <allan.haldane@gmail.com>
Date: Sat, 17 Oct 2015 14:00:36 -0400
Subject: [PATCH] BUG: recarrays viewed as subarrays don't convert to np.record
type
Record array views were updated in #5943 to return np.record dtype
where possible, but forgot about the case of sub-arrays.
That's fixed here, so accessing subarray fields by attribute or index
works sensibly, as well as viewing a record array as a subarray dtype,
and printing subarrays.
This also happens to fix #6459, since it affects the same lines.
Fixes #6497 #6459
---
numpy/core/records.py | 30 +++++++++++++++++++-----------
numpy/core/tests/test_records.py | 23 +++++++++++++++++++++++
2 files changed, 42 insertions(+), 11 deletions(-)
diff --git a/numpy/core/records.py b/numpy/core/records.py
index 4a99553..4ce3fe9 100644
--- a/numpy/core/records.py
+++ b/numpy/core/records.py
@@ -448,12 +448,14 @@ def __getattribute__(self, attr):
# At this point obj will always be a recarray, since (see
# PyArray_GetField) the type of obj is inherited. Next, if obj.dtype is
- # non-structured, convert it to an ndarray. If obj is structured leave
- # it as a recarray, but make sure to convert to the same dtype.type (eg
- # to preserve numpy.record type if present), since nested structured
- # fields do not inherit type.
+ # non-structured, convert it to an ndarray. Then if obj is structured
+ # with void type convert it to the same dtype.type (eg to preserve
+ # numpy.record type if present), since nested structured fields do not
+ # inherit type. Don't do this for non-void structures though.
if obj.dtype.fields:
- return obj.view(dtype=(self.dtype.type, obj.dtype.fields))
+ if issubclass(obj.dtype.type, nt.void):
+ return obj.view(dtype=(self.dtype.type, obj.dtype))
+ return obj
else:
return obj.view(ndarray)
@@ -463,8 +465,9 @@ def __getattribute__(self, attr):
# Thus, you can't create attributes on-the-fly that are field names.
def __setattr__(self, attr, val):
- # Automatically convert (void) dtypes to records.
- if attr == 'dtype' and issubclass(val.type, nt.void):
+ # Automatically convert (void) structured types to records
+ # (but not non-void structures, subarrays, or non-structured voids)
+ if attr == 'dtype' and issubclass(val.type, nt.void) and val.fields:
val = sb.dtype((record, val))
newattr = attr not in self.__dict__
@@ -499,7 +502,9 @@ def __getitem__(self, indx):
# we might also be returning a single element
if isinstance(obj, ndarray):
if obj.dtype.fields:
- return obj.view(dtype=(self.dtype.type, obj.dtype.fields))
+ if issubclass(obj.dtype.type, nt.void):
+ return obj.view(dtype=(self.dtype.type, obj.dtype))
+ return obj
else:
return obj.view(type=ndarray)
else:
@@ -519,11 +524,14 @@ def __repr__(self):
# If this is a full record array (has numpy.record dtype),
# or if it has a scalar (non-void) dtype with no records,
# represent it using the rec.array function. Since rec.array
- # converts dtype to a numpy.record for us, use only dtype.descr,
- # not repr(dtype).
+ # converts dtype to a numpy.record for us, convert back
+ # to non-record before printing
+ plain_dtype = self.dtype
+ if plain_dtype.type is record:
+ plain_dtype = sb.dtype((nt.void, plain_dtype))
lf = '\n'+' '*len("rec.array(")
return ('rec.array(%s, %sdtype=%s)' %
- (lst, lf, repr(self.dtype.descr)))
+ (lst, lf, plain_dtype))
else:
# otherwise represent it using np.array plus a view
# This should only happen if the user is playing
diff --git a/numpy/core/tests/test_records.py b/numpy/core/tests/test_records.py
index 7a18f29..290bc4f 100644
--- a/numpy/core/tests/test_records.py
+++ b/numpy/core/tests/test_records.py
@@ -121,6 +121,23 @@ def test_recarray_views(self):
assert_equal(type(rv), np.recarray)
assert_equal(rv.dtype.type, np.record)
+ # check that accessing nested structures keep record type, but
+ # not for subarrays, non-void structures, non-structured voids
+ test_dtype = [('a', 'f4,f4'), ('b', 'V8'), ('c', ('f4',2)),
+ ('d', ('i8', 'i4,i4'))]
+ r = np.rec.array([((1,1), b'11111111', [1,1], 1),
+ ((1,1), b'11111111', [1,1], 1)], dtype=test_dtype)
+ assert_equal(r.a.dtype.type, np.record)
+ assert_equal(r.b.dtype.type, np.void)
+ assert_equal(r.c.dtype.type, np.float32)
+ assert_equal(r.d.dtype.type, np.int64)
+ # check the same, but for views
+ r = np.rec.array(np.ones(4, dtype='i4,i4'))
+ assert_equal(r.view('f4,f4').dtype.type, np.record)
+ assert_equal(r.view(('i4',2)).dtype.type, np.int32)
+ assert_equal(r.view('V8').dtype.type, np.void)
+ assert_equal(r.view(('i8', 'i4,i4')).dtype.type, np.int64)
+
#check that we can undo the view
arrs = [np.ones(4, dtype='f4,i4'), np.ones(4, dtype='f8')]
for arr in arrs:
@@ -135,6 +152,12 @@ def test_recarray_repr(self):
a = np.array(np.ones(4, dtype='f8'))
assert_(repr(np.rec.array(a)).startswith('rec.array'))
+ # check that the 'np.record' part of the dtype isn't shown
+ a = np.rec.array(np.ones(3, dtype='i4,i4'))
+ assert_equal(repr(a).find('numpy.record'), -1)
+ a = np.rec.array(np.ones(3, dtype='i4'))
+ assert_(repr(a).find('dtype=int32') != -1)
+
def test_recarray_from_names(self):
ra = np.rec.array([
(1, 'abc', 3.7000002861022949, 0),

View File

@@ -1,73 +0,0 @@
From 0d25dc4175e00cdaf9545e8b1b1a5b879cf67248 Mon Sep 17 00:00:00 2001
From: Ethan Kruse <eakruse@uw.edu>
Date: Mon, 19 Oct 2015 13:29:01 -0700
Subject: [PATCH 1/2] Potential fix for #6462
---
numpy/lib/function_base.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/numpy/lib/function_base.py b/numpy/lib/function_base.py
index 555d083..fef69df 100644
--- a/numpy/lib/function_base.py
+++ b/numpy/lib/function_base.py
@@ -3339,7 +3339,7 @@ def _median(a, axis=None, out=None, overwrite_input=False):
indexer[axis] = slice(index-1, index+1)
# Check if the array contains any nan's
- if np.issubdtype(a.dtype, np.inexact):
+ if np.issubdtype(a.dtype, np.inexact) and sz > 0:
# warn and return nans like mean would
rout = mean(part[indexer], axis=axis, out=out)
part = np.rollaxis(part, axis, part.ndim)
From 59d859fb2160950ac93267d7461ad952145c8724 Mon Sep 17 00:00:00 2001
From: Ethan Kruse <eakruse@uw.edu>
Date: Tue, 20 Oct 2015 11:40:49 -0700
Subject: [PATCH 2/2] Added tests for median of empty arrays
---
numpy/lib/tests/test_function_base.py | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/numpy/lib/tests/test_function_base.py b/numpy/lib/tests/test_function_base.py
index 4516c92..aa41c1f 100644
--- a/numpy/lib/tests/test_function_base.py
+++ b/numpy/lib/tests/test_function_base.py
@@ -2597,6 +2597,36 @@ def test_nan_behavior(self):
assert_equal(np.median(a, (0, 2)), b)
assert_equal(len(w), 1)
+ def test_empty(self):
+ # empty arrays
+ a = np.array([], dtype=float)
+ with warnings.catch_warnings(record=True) as w:
+ warnings.filterwarnings('always', '', RuntimeWarning)
+ assert_equal(np.median(a), np.nan)
+ assert_(w[0].category is RuntimeWarning)
+
+ # multiple dimensions
+ a = np.array([], dtype=float, ndmin=3)
+ # no axis
+ with warnings.catch_warnings(record=True) as w:
+ warnings.filterwarnings('always', '', RuntimeWarning)
+ assert_equal(np.median(a), np.nan)
+ assert_(w[0].category is RuntimeWarning)
+
+ # axis 0 and 1
+ b = np.array([], dtype=float, ndmin=2)
+ with warnings.catch_warnings(record=True) as w:
+ warnings.filterwarnings('always', '', RuntimeWarning)
+ assert_equal(np.median(a, axis=0), b)
+ assert_equal(np.median(a, axis=1), b)
+
+ # axis 2
+ b = np.array(np.nan, dtype=float, ndmin=2)
+ with warnings.catch_warnings(record=True) as w:
+ warnings.filterwarnings('always', '', RuntimeWarning)
+ assert_equal(np.median(a, axis=2), b)
+ assert_(w[0].category is RuntimeWarning)
+
def test_object(self):
o = np.arange(7.)
assert_(type(np.median(o.astype(object))), float)

View File

@@ -1,71 +0,0 @@
--- numpy-1.11.1/numpy/distutils/system_info.py
+++ numpy-1.11.1/numpy/distutils/system_info.py
@@ -312,26 +312,7 @@
1 - display warning message
2 - raise error
"""
- cl = {'atlas': atlas_info, # use lapack_opt or blas_opt instead
- 'atlas_threads': atlas_threads_info, # ditto
- 'atlas_blas': atlas_blas_info,
- 'atlas_blas_threads': atlas_blas_threads_info,
- 'lapack_atlas': lapack_atlas_info, # use lapack_opt instead
- 'lapack_atlas_threads': lapack_atlas_threads_info, # ditto
- 'atlas_3_10': atlas_3_10_info, # use lapack_opt or blas_opt instead
- 'atlas_3_10_threads': atlas_3_10_threads_info, # ditto
- 'atlas_3_10_blas': atlas_3_10_blas_info,
- 'atlas_3_10_blas_threads': atlas_3_10_blas_threads_info,
- 'lapack_atlas_3_10': lapack_atlas_3_10_info, # use lapack_opt instead
- 'lapack_atlas_3_10_threads': lapack_atlas_3_10_threads_info, # ditto
- 'mkl': mkl_info,
- # openblas which may or may not have embedded lapack
- 'openblas': openblas_info, # use blas_opt instead
- # openblas with embedded lapack
- 'openblas_lapack': openblas_lapack_info, # use blas_opt instead
- 'lapack_mkl': lapack_mkl_info, # use lapack_opt instead
- 'blas_mkl': blas_mkl_info, # use blas_opt instead
- 'x11': x11_info,
+ cl = {'x11': x11_info,
'fft_opt': fft_opt_info,
'fftw': fftw_info,
'fftw2': fftw2_info,
@@ -669,10 +650,7 @@
return [b for b in [a.strip() for a in libs.split(',')] if b]
def get_libraries(self, key='libraries'):
- if hasattr(self, '_lib_names'):
- return self.get_libs(key, default=self._lib_names)
- else:
- return self.get_libs(key, '')
+ return self.get_libs(key, '')
def library_extensions(self):
static_exts = ['.a']
@@ -1685,7 +1663,7 @@
lib = self.has_cblas(info)
if lib is not None:
info['language'] = 'c'
- info['libraries'] = [lib]
+ info['libraries'] = lib
info['define_macros'] = [('HAVE_CBLAS', None)]
self.set_info(**info)
@@ -1718,16 +1696,16 @@
# check for cblas lib, and if not present check for blas lib.
try:
c.link_executable(obj, os.path.join(tmpdir, "a.out"),
- libraries=["cblas"],
+ libraries=info["libraries"],
library_dirs=info['library_dirs'],
extra_postargs=info.get('extra_link_args', []))
- res = "cblas"
+ res = info["libraries"]
except distutils.ccompiler.LinkError:
c.link_executable(obj, os.path.join(tmpdir, "a.out"),
libraries=["blas"],
library_dirs=info['library_dirs'],
extra_postargs=info.get('extra_link_args', []))
- res = "blas"
+ res = ["blas"]
except distutils.ccompiler.CompileError:
res = None
finally:

View File

@@ -1,27 +0,0 @@
From 5d0ce36e5be134bb5ead03cab1edeaa60fa355aa Mon Sep 17 00:00:00 2001
From: Jonathan Helmus <jjhelmus@gmail.com>
Date: Wed, 12 Oct 2016 13:07:42 -0500
Subject: [PATCH] BUG: import full module path in npy_load_module
Use the full module path when importing importlib.machinery for use in the
npy_load_module function. Just importing importlib is not sufficient in certain
cases, for example Python 3.4.
closes #8147
---
numpy/compat/py3k.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/numpy/compat/py3k.py b/numpy/compat/py3k.py
index 25cc535..d5bb2e4 100644
--- a/numpy/compat/py3k.py
+++ b/numpy/compat/py3k.py
@@ -118,7 +118,7 @@ def npy_load_module(name, fn, info=None):
mod : module
"""
- import importlib
+ import importlib.machinery
return importlib.machinery.SourceFileLoader(name, fn).load_module()
else:
def npy_load_module(name, fn, info=None):