<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Jun 5, 2017 at 4:06 PM, Mikhail V <span dir="ltr"><<a href="mailto:mikhailwas@gmail.com" target="_blank">mikhailwas@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Likely it was about some new string array type...</blockquote><div><br></div><div>yes, it was.</div><div> </div><div>> Obviously there is demand. Terror of unicode touches many aspects</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
of programmers life. </blockquote><div><br></div><div>I don't know that I'd call it Terror, but frankly, the fact that you need up to 4 bytes for a single character is really not the big issues. Given that computer memory has grown by literally orders of magnitude since Unicode was introduced, I don't know why there is such a hang up about it.</div><div><br></div><div>But we're scientific programmers we like to be efficient !</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Foremost, it comes down to the question of defining this "optimal<br>
8-bit character table".<br>
And "Latin-1", (exactly as it is)  is not that optimal table,</blockquote><div><br></div><div>there is no such thing as a single "optimal" set of characters when you are limited to 255 of them...</div><div><br></div><div>latin-1 is pretty darn good for the, well, latin-based languages....</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">But, granted, if define most accented letters as<br>
"optional", i.e . delete them<br>
then it is quite reasonable basic char table to start with.<br></blockquote><div><br></div><div>Then you are down to ASCII, no?</div><div> </div><div>but anyway, I don't think a new encoding is really the topic at hand here....</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">>> I don't know what you're doing, but I don't think numpy is normally the<br>
>> right tool for text manipulation...<br>
><br>
><br>
> I agree here. But if one were to add such a thing (vectorized string<br>
> operations) -- I'd think the thing to do would be to wrap (or port) the<br>
> python string methods. But it shoudl only work for actual string dtypes, of<br>
> course.<br>
><br>
> note that another part of the discussion previously suggested that we have a<br>
> dtype that wraps a native python string object -- then you'd get all for<br>
> free. This is essentially an object array with strings in it, which you can<br>
> do now.<br>
><br>
<br>
</span>Well here I must admit I don't quite understand the whole idea of<br>
"numpy array of string type". How used? What is main bebefit/feature...?<br></blockquote><div><br></div><div>here you go -- you can do this now:</div><div><br></div><font face="monospace, monospace">In [74]: s_arr = np.array([s, "another string"], dtype=np.object)<br>In [75]: <br><br>In [75]: s_arr<br>Out[75]: array(['012 АБВ', 'another string'], dtype=object)<br><br>In [76]: s_arr.shape<br>Out[76]: (2,)</font><div><br></div><div>You now have an array with python string object in it -- thus access to all the string functionality:</div><font face="monospace, monospace"><div class="gmail_quote"><font face="monospace, monospace"><br></font></div>In [81]: s_arr[1] = s_arr[1].upper()<br>In [82]: s_arr<br>Out[82]: array(['012 АБВ', 'ANOTHER STRING'], dtype=object)</font><div><br></div><div>and the ability to have each string be a different length.</div><div><br></div><div>If numpy were to know that those were string objects, rather than arbitrary python objects, it could do vectorized operations on them, etc.</div><div><br></div><div>You can do that now with numpy.vectorize, but it's pretty klunky.</div><div><br></div><div><p class="gmail-p1"><font face="monospace, monospace">In [87]: np_upper = np.vectorize(str.upper)<br>In [88]: np_upper(s_arr)<br><br>Out[88]: <br>array(['012 АБВ', 'ANOTHER STRING'], <br>      dtype='<U14')</font> <br></p></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Example integer array usage in context of textual data in my case:<br>
- holding data in a text editor (mutability+indexing/slicing)<br>
</blockquote><div><br></div><div>you really want to use regular old python data structures for that...</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">- filtering, transformations (e.g. table translations, cryptography, etc.)<br></blockquote><div><br></div><div>that may be something to do with ordinals and numpy -- but then you need to work with ascii or latin-1 and uint8 dtypes, or full Unicode and uint32 dtype -- that's that.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
String type array? Will this be a string array you describe:<br>
<br>
s= "012 abc"<br>
arr = np.array(s)<br>
print ("type ", arr.dtype)<br>
print ("shape ", arr.shape)<br>
<span class="gmail-">print ("my array: ", arr)<br>
</span>arr = np.roll(arr[0],2)<br>
<span class="gmail-">print ("my array: ", arr)<br>
-><br>
</span>type  <U7<br>
shape  ()<br>
my array:  012 abc<br>
my array:  012 abc<br>
<br>
<br>
So what it does? What's up with shape?<br></blockquote><div><br></div><div>shape is an empty tuple, meaning this is a numpy scalar, containing a single string</div><div><br></div><div>type '<U7' means little endian, unicode, 7 characters</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
e.g. here I wanted to 'roll' the string.<br>
How would I replace chars? or delete?<br>
What is the general idea behind?<br></blockquote><div><br></div><div>the numpy string type (unicode type) works with fixed length strings -- not characters, but you can reshape it and make a view:</div><div><br></div><font face="monospace, monospace">In [89]: s= "012 abc"<br><br>In [90]: arr.shape = (1,)<br><br>In [91]: arr.shape<br>Out[91]: (1,)<br><br>In [93]: c_arr = arr.view(dtype = '<U1')<br><br>In [97]: np.roll(c_arr, 3)<br>Out[97]:<br>array(['a', 'b', 'c', '0', '1', '2', ' '],<br>      dtype='<U1')</font><div><br></div><div>You could also create it as a character array in the first place by unpacking it into a list first:</div><div><br></div><font face="monospace, monospace">In [98]: c_arr = np.array(list(s))<br><br>In [99]: c_arr<br>Out[99]: <br>array(['0', '1', '2', ' ', 'a', 'b', 'c'], <br>      dtype='<U1')<br><br></font></div><br>-CHB<div class="gmail_quote"><font face="monospace, monospace"><br></font></div><div>-- <br></div><div class="gmail_signature"><br>Christopher Barker, Ph.D.<br>Oceanographer<br><br>Emergency Response Division<br>NOAA/NOS/OR&R            (206) 526-6959   voice<br>7600 Sand Point Way NE   (206) 526-6329   fax<br>Seattle, WA  98115       (206) 526-6317   main reception<br><br><a href="mailto:Chris.Barker@noaa.gov" target="_blank">Chris.Barker@noaa.gov</a></div>
</div></div>