Changeset 1871
- Timestamp:
- 01/10/06 21:25:42 (3 years ago)
- Files:
-
- trunk/numpy/core/src/arrayobject.c (modified) (2 diffs)
- trunk/numpy/core/tests/test_multiarray.py (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/numpy/core/src/arrayobject.c
r1868 r1871 1763 1763 static PyObject *iter_subscript(PyArrayIterObject *, PyObject *); 1764 1764 1765 int 1766 count_new_axes_0d(PyObject *tuple) 1767 { 1768 int i, argument_count; 1769 int ellipsis_count = 0; 1770 int newaxis_count = 0; 1771 argument_count = PyTuple_GET_SIZE(tuple); 1772 for (i = 0; i < argument_count; ++i) { 1773 PyObject *arg = PyTuple_GET_ITEM(tuple, i); 1774 ellipsis_count += (arg == Py_Ellipsis); 1775 newaxis_count += (arg == Py_None); 1776 } 1777 if (newaxis_count + ellipsis_count != argument_count) { 1778 PyErr_SetString(PyExc_IndexError, 1779 "0-d arrays can use a single ()" 1780 " or a list of ellipses and newaxis" 1781 " as an index"); 1782 return -1; 1783 } 1784 if (newaxis_count > MAX_DIMS) { 1785 PyErr_SetString(PyExc_IndexError, 1786 "too many dimensions"); 1787 return -1; 1788 } 1789 return newaxis_count; 1790 1791 } 1792 static PyObject * 1793 add_new_axes_0d(PyArrayObject *arr, int newaxis_count) 1794 { 1795 PyArrayObject *other; 1796 intp dimensions[MAX_DIMS], strides[MAX_DIMS]; 1797 int i; 1798 for (i = 0; i < newaxis_count; ++i) { 1799 dimensions[i] = strides[i] = 1; 1800 } 1801 Py_INCREF(arr->descr); 1802 if ((other = (PyArrayObject *) 1803 PyArray_NewFromDescr(arr->ob_type, arr->descr, 1804 newaxis_count, dimensions, 1805 strides, arr->data, 1806 arr->flags, 1807 (PyObject *)arr)) == NULL) 1808 return NULL; 1809 1810 other->base = (PyObject *)arr; 1811 Py_INCREF(arr); 1812 1813 other ->flags &= ~OWNDATA; 1814 1815 return (PyObject *)other; 1816 } 1817 1765 1818 static PyObject * 1766 1819 array_subscript(PyArrayObject *self, PyObject *op) … … 1797 1850 } 1798 1851 if (self->nd == 0) { 1799 if (op == Py_Ellipsis || (PyTuple_Check(op) && \ 1800 0 == PyTuple_GET_SIZE(op))) 1852 if (op == Py_Ellipsis) 1801 1853 return PyArray_ToScalar(self->data, self); 1854 if (op == Py_None) 1855 return add_new_axes_0d(self, 1); 1856 if (PyTuple_Check(op)) { 1857 if (0 == PyTuple_GET_SIZE(op)) 1858 return PyArray_ToScalar(self->data, self); 1859 if ((nd = count_new_axes_0d(op)) == -1) 1860 return NULL; 1861 return add_new_axes_0d(self, nd); 1862 } 1802 1863 PyErr_SetString(PyExc_IndexError, 1803 1864 "0-d arrays can't be indexed."); trunk/numpy/core/tests/test_multiarray.py
r1866 r1871 76 76 def check_ellipsis_subscript(self): 77 77 a,b = self.d 78 79 78 self.failUnlessEqual(a[...], 0) 80 79 self.failUnlessEqual(b[...].item(), 'x') … … 84 83 def check_empty_subscript(self): 85 84 a,b = self.d 86 87 85 self.failUnlessEqual(a[()], 0) 88 86 self.failUnlessEqual(b[()].item(), 'x') … … 99 97 def check_ellipsis_subscript_assignment(self): 100 98 a,b = self.d 101 102 99 a[...] = 42 103 100 self.failUnlessEqual(a, 42) … … 107 104 def check_empty_subscript_assignment(self): 108 105 a,b = self.d 109 110 106 a[()] = 42 111 107 self.failUnlessEqual(a, 42) … … 121 117 self.failUnlessRaises(TypeError, assign, a, (), '') 122 118 123 119 def check_newaxis(self): 120 a,b = self.d 121 self.failUnlessEqual(a[newaxis].shape, (1,)) 122 self.failUnlessEqual(a[..., newaxis].shape, (1,)) 123 self.failUnlessEqual(a[newaxis, ...].shape, (1,)) 124 self.failUnlessEqual(a[..., newaxis].shape, (1,)) 125 self.failUnlessEqual(a[newaxis, ..., newaxis].shape, (1,1)) 126 self.failUnlessEqual(a[..., newaxis, newaxis].shape, (1,1)) 127 self.failUnlessEqual(a[newaxis, newaxis, ...].shape, (1,1)) 128 self.failUnlessEqual(a[(newaxis,)*10].shape, (1,)*10) 129 130 def check_invalid_newaxis(self): 131 a,b = self.d 132 def subscript(x, i): x[i] 133 self.failUnlessRaises(IndexError, subscript, a, (newaxis, 0)) 134 self.failUnlessRaises(IndexError, subscript, a, (newaxis,)*50) 124 135 125 136 if __name__ == "__main__":
